SQL Server:执行存储过程问题

Posted

技术标签:

【中文标题】SQL Server:执行存储过程问题【英文标题】:SQL Server : executing stored procedure problems 【发布时间】:2021-05-22 06:43:31 【问题描述】:

我正在尝试执行一个存储过程,但一直收到错误:

过程或函数“dynamictable”需要参数“@tablename”,但未提供该参数

你能修复我的代码吗?

conn.Open();    
SqlCommand search = new SqlCommand("dbo.dynamictable", conn);
search.CommandType = CommandType.StoredProcedure;
search.Parameters.Add(new SqlParameter("@tablename", table));
search.Parameters.Add(new SqlParameter("width", housewidth.ToString()));

如果它可以帮助你帮助我,这里是查询:

CREATE PROCEDURE dynamictable
    (@tablename nvarchar(100), @width nvarchar(50))
AS
BEGIN
    DECLARE @SQL nvarchar(max)

    SELECT @SQL = 'SELECT * FROM [' + @tablename+ '] WHERE [Width] = '+ @width;

    EXEC sp_executesql @SQL
END

【问题讨论】:

您使用的是哪个 dbms? (该代码是特定于产品的。) 我必须质疑具有名为 width 的列的表的数量。这种方法有一个XY problem smell。 【参考方案1】:

如果table 为空,那么您将收到该消息。

您确实应该指定参数的类型和大小:

search.Parameters.Add(new SqlParameter("@tablename", SqlDbType.NVarChar, 128).Value = table;
search.Parameters.Add(new SqlParameter("@width", SqlDbType.Int).value = housewidth;

您当前的查询也存在 SQL 注入的风险。即使在动态部分,它也应该使用适当的参数化和转义:

CREATE procedure dynamictable
    (@tablename nvarchar(128), @width int)
as
begin

declare @SQL nvarchar(max) =
N'SELECT * FROM ' + QUOTENAME(@tablename) + ' WHERE [Width] = @width;';
exec sp_executesql @SQL, N'@width int', @width = @width;

end

【讨论】:

【参考方案2】:

'过程或函数'dynamictable'需要参数'@tablename',但未提供。'

该错误通常意味着名为 table 的 C# 变量为空。您的存储过程似乎没有任何相关问题。 (而且你提到的 '@' 是额外的 - 所以从技术上讲,tablename 尚未设置.. (: )

【讨论】:

【参考方案3】:

在传递参数名称时将“@”从参数名称中删除

search.Parameters.Add(new SqlParameter("tablename", table));

【讨论】:

我尝试了你的方法,它仍然返回相同的错误 @ThanhLamChi 尝试更新命令,就像在 sq-server 上运行它一样。例如 SqlCommand("exec dbo.dynamictable (at)tablename, (at)width", conn);

以上是关于SQL Server:执行存储过程问题的主要内容,如果未能解决你的问题,请参考以下文章

sql server:如何设置自动执行的存储过程?

SQL Server 如何执行 带参数的 存储过程

SQL Server 中存储过程之后的执行顺序

SQL Server 里需要定时执行某个存储过程,存储过程怎么写?

如何在sql server的另一个存储过程中执行存储过程

从 Sql Server 2008 执行 oracle 存储过程