【问题标题】:exec sp_executesql @sql and exec (@sql) SQL Serverexec sp_executesql @sql 和 exec (@sql) SQL Server
【发布时间】:2023-03-25 06:30:01
【问题描述】:

来自lobodava 的动态 SQL 查询是:

declare @sql nvarchar(4000) =
    N';with cteColumnts (ORDINAL_POSITION, COLUMN_NAME) as 
    (
        select ORDINAL_POSITION, COLUMN_NAME 
        from INFORMATION_SCHEMA.COLUMNS 
        where TABLE_NAME = N'''+ @tableName + ''' and COLUMN_NAME like ''' + @columnLikeFilter + '''
    ),
    cteValues (ColumnName, SumValue) as
    (
        SELECT ColumnName, SumValue
        FROM 
           (SELECT ' + @sumColumns + '
           FROM dbo.' + @tableName + ') p
        UNPIVOT
           (SumValue FOR ColumnName IN 
              (' + @columns + ')
        )AS unpvt 
    )
    select row_number() over(order by ORDINAL_POSITION) as ID, ColumnName, SumValue
    from cteColumnts c inner join cteValues v on COLUMN_NAME = ColumnName
    order by ORDINAL_POSITION'

exec sp_executesql @sql
--或
执行 (@sql)

为什么 lobodava 选择 exec sp_executesql @sql 而不是 exec(@sql) 那么这里有什么区别呢?
使用sp_executesql on recursive dynamic queries会更好吗?
在其他帖子中,他们说sp_executesql 更有可能促进查询计划重用...... 那么它对这类查询有帮助吗?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008 dynamic-sql


    【解决方案1】:

    因为EXEC sp_executesql 会缓存查询计划——EXEC 不会。有关更多信息和非常好的阅读,请参阅:

    缓存查询意味着临时存储查询的物流,并使其稍后运行查询更快。

    【讨论】:

    • 那么,在这种查询上使用sp_executesql 很好,因为查询plan,对吧?
    • @darkcminor:是的,EXEC sp_executesql 应该是您在大多数情况下使用的,当您必须在 SQL Server 上使用动态 SQL 时。
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    相关资源
    最近更新 更多