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:执行存储过程问题的主要内容,如果未能解决你的问题,请参考以下文章