sql - 在 exec 中声明变量会改进 SQL 查询计划吗?

我有一堆存储过程需要优化,想知道从将变量注入(inject) WHERE 条件更改为将它们注入(inject)变量声明是否会有帮助

当前语句看起来像这样,其中 id 被传递到存储过程中,然后注入(inject)到 EXEC 中

DECLARE @EmployeeId int = 123
DECLARE @CustomerId int = 456

EXEC('
SELECT * FROM Employees WHERE Id = ' + @EmployeeId + '

SELECT * FROM Customers WHERE Id = ' + @CustomerId + '
')

更改为将注入(inject)值完成到变量中的这种方式会有任何好处吗?

DECLARE @EmployeeId int = 123
DECLARE @CustomerId int = 456

EXEC('
DECLARE @EmployeeId int = ' + @EmployeeId + '
DECLARE @CustomerId int = ' + @CustomerId + '


SELECT * FROM Employees WHERE Id = @EmployeeId

SELECT * FROM Customers WHERE Id = @CustomerId
')

最佳答案

我建议执行参数化查询而不是注入(inject)变量。这将促进执行计划的重用,还有其他好处。

DECLARE @EmployeeId int = 123;
DECLARE @CustomerId int = 456;

EXEC sp_executesql 
     N'SELECT * FROM Employees WHERE Id = @EmployeeId;SELECT * FROM Customers WHERE Id = @CustomerId'
    ,N'@EmployeeId int, @CustomerId int'
    ,@EmployeeId = @EmployeeId
    ,@CustomerId = @CustomerId;

https://stackoverflow.com/questions/69889420/

相关文章:

arrays - 为什么文本行数组看起来有一个额外的容器级别?

javascript - discord.js 禁用 “interaction failed”

c++ - 如何直接从输入流中向集合中插入值?

r - 如何编写一个 apply() 函数来将矩阵列中的每个元素限制为最大允许值?

list - 如何更新 Haskell 中的列表元素

javascript - 遍历对象数组并获得新的对象数组

python - 如何在 python 中删除表的某些行?

python - 如何使用 while 循环摆脱空字符串? (Python)

python - 将多列的不同值组合成 Polars 中的一列

regex - 如何验证用户输入中的 Perl 正则表达式?