我读到在存储过程中使用动态 SQL 会损害存储过程的性能。我猜理论上存储过程不会存储通过 EXEC 或 sp_executesql 执行的 SQL 的执行计划。
我想知道这是不是真的。如果是这样,我是否对多个嵌套的 IF block 有同样的问题,每个 block 都有不同的 SQL 语句“版本”?
最佳答案
如果您有多个嵌套的 IF block ,那么 SQL Server 将能够存储执行计划。 我假设 IF 很简单,例如。如果@Parameter1 不为空
SchmitzIT 的回答是正确的,SQL Server 也可以存储动态 SQL 的执行路径。但是,只有在正确构建和执行 sql 的情况下才会出现这种情况。
通过正确构建,我的意思是显式声明参数并将它们传递给 sp_executesql。例如
declare @Param1 nvarchar(255) = 'foo'
,@Param2 nvarchar(255) = 'bar'
,@sqlcommand nvarchar(max)
,@paramList nvarchar(max)
set @paramList = '@Param1 nvarchar(255), @Param2 nvarchar(255)'
set @sqlcommand = N'Select Something from Table where Field1 = @Param1 AND Field2 = @Param2'
exec sp_executesql @statement = @sqlcommand
,@params = @paramList
,@Param1 = @Param1
,@Param2 = @Param2
如您所见,sql 命令文本并未对要使用的参数值进行硬编码。它们分别在exec sp_executesql中传递
如果你写了糟糕的旧动态 sql
set @sqlcommand = N'Select Something from Table where Field1 = ' + @Param1 + ' AND Field2 = ' + @Param2
exec sp_executesql @sqlcommand
那么 SQL Server 将无法存储执行计划
关于sql-server - 动态 SQL 和存储过程优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13259850/