变量值可以传递到局部变量中吗?然后是否可以使用本地 vairable 来构建动态 SQL 查询



我正在尝试将用户输入的数据传递给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

你可能处理多少张表?如果数量很少,您有两个更好的选择:

  1. 使用多个存储过程而不是一个存储过程,并根据所需的表调用它们。可以在调用例程中使用参数来指示所需的 SP。
  2. 使用
  3. 参数指定所需的表,但随后使用以下条件,而不是使用变量更改 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注入问题,但同样,只有在表的数量"小"时才有效("小"是你想要的!

相关内容

  • 没有找到相关文章

最新更新