sql-server - 动态 SQL 和存储过程优化

标签 sql-server sql-server-2008 stored-procedures dynamic-sql

我读到在存储过程中使用动态 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/

相关文章:

c# - 如何在 MVC Controller 中使用 Linq 连接两个表

php - 使用 PHP 备份 SQL Server 数据库

sql - TSql 案例中的案例

sql-server - GetDate() 与 EXEC 一起使用时会导致错误

MySql 存储过程通过命令在使用 select 语句时不同步而没有结果

sql-server - 无需凭据即可连接到 SQL Azure?

c# - 尝试使用 WebMatrix 从 sql server ce 数据库中动态删除一行时出错

sql-server - SSIS ForEach 循环 - 更改 for 循环内的连接

sql-server - 如何修复 Microsoft SQL Server,错误 : 262?

MySQL 存储过程错误处理