【问题标题】:SQL Server : executing stored procedure problemsSQL Server:执行存储过程问题
【发布时间】: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

标签: c# sql sql-server tsql


【解决方案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);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2021-06-14
      • 1970-01-01
      • 2011-11-07
      • 2012-04-18
      • 2013-08-14
      • 1970-01-01
      相关资源
      最近更新 更多