我正在尝试将用户输入的数据传递给SQL"sp_executesql"(动态SQL)语句,以便为"SELECT","FROM"和"WHERE"语句构建字符串。
我知道 SQL Server 不会接受表名或列名作为参数。但是,我想知道是否可以获取用户输入的值,将它们存储在locaL-SQL变量中,然后在" FROM"子句中使用局部变量?
我知道这段代码会起作用:
set @tableName = 'SalesData'
set @monthNo = 2
set @sql = N'
select SalesPerson
from ' + @tableName + '
where mon = @monthNo'
exec sp_executesql @sql, N'@monthNo int', @monthNo
但是,此代码会运行吗?
set @tableName = @ValueTypedByUser
set @monthNo = 2
set @sql = N'
select SalesPerson
from ' + @tableName + '
where mon = @monthNo'
exec sp_executesql @sql, N'@monthNo int', @monthNo
你可能处理多少张表?如果数量很少,您有两个更好的选择:
- 使用多个存储过程而不是一个存储过程,并根据所需的表调用它们。可以在调用例程中使用参数来指示所需的 SP。 使用
- 参数指定所需的表,但随后使用以下条件,而不是使用变量更改 SP 中的表名称:
IF @table = 'SalesPersonTable'
BEGIN
SELECT SalesPerson
FROM SalesPersonTable
WHERE mon = @monthNo
END
IF @table = 'OtherTable'
BEGIN
SELECT SalesPerson
FROM OtherTable
WHERE mon = @monthNo
END
这避免了SQL注入问题,但同样,只有在表的数量"小"时才有效("小"是你想要的!