【问题标题】:Several compiled plans for query in SQL Stored procedureSQL存储过程中查询的几个编译计划
【发布时间】:2016-01-19 12:45:16
【问题描述】:

我们在 SQL Server 2012 中有一个过程,其查询如下:

    SET @sSQL = 'SELECT Column1,
                        Column2
                 FROM Table
                 WHERE Column1 = ' + CONVERT(NVARCHAR, @ColumnID ) 

@ColumnID 是存储过程中的一个参数。

它创建了很多编译计划。为什么以及如何解决?

【问题讨论】:

  • 显示你的整个存储过程,为什么要使用动态SQL?

标签: sql sql-server select sql-server-2012


【解决方案1】:

使用sp_executesql,所以值可以是参数:

SET @sSQL = 'SELECT Column1,
                    Column2
             FROM   Table
             WHERE  Column1 = @ColumnId';

EXEC sp_executesql @sSQL, N'@ColumnId int', @ColumnId = @ColumnId;

【讨论】:

  • 为什么是INT 而不是UNIQUEIDENTIFIER/DATE
  • 我们已经使用 EXECUTE sp_executesql @sSQL。但问题在于皈依者吗?
  • @Star 。 . .关键是使用参数而不是将它们嵌入到字符串中。除此之外,这允许 SQL 引擎只编译一次查询。
  • @lad2025 。 . .因为工作代码没有围绕值的单引号,表明它是数字。
  • @GarethD,CONVERT 函数中的默认长度是 30 而不是 32。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多