首页 > 解决方案 > SQL Server:执行存储过程问题

问题描述

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

过程或函数“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

标签: c#sqlsql-servertsql

解决方案


如果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

推荐阅读