存储过程内的动态 SQL

存储过程内的动态 SQL

由于其中有动态 SQL,下面的存储过程是否会在每次运行时重新编译?这种方法是否会对性能造成严重影响?

CREATE PROCEDURE MyStoredProcedure
AS
BEGIN
 DECLARE @column varchar(3)
 SELECT @column = 'd' + CAST(DAY(GETDATE()) AS char)

 EXEC ('SELECT ' + @column + ' FROM t1')
END

答案1

如果可能的话,最好避免使用动态 SQL,这是正确的。有关更详细的讨论,请参阅这个 SO 线程。但是,具体回答您的问题:该EXEC ('SELECT d21 FROM t1')语句的行为与服务器收到包含脚本的客户端请求完全一样SELECT d21 FROM t1。如果计划已经在缓存中,它将从缓存中执行(保留一些细节,如元数据版本更改等)。如果没有,它将被编译,创建一个新计划并运行。请注意,像这样的查询SELECT field FROM Table就是所谓的'简单计划查询',在大多数系统上,制定此类计划的成本完全可以忽略不计。

答案2

不,该过程不应该在每次运行时重新编译,即使这样做,调用的性能也不会差很多,因为动态 SQL 已经足够慢了。该过程的这一部分在每次运行时都会被解析和执行。

相关内容