exec sp_executesql @sql и exec (@sql) SQL Server - PullRequest
9 голосов
/ 10 марта 2011

Динамический запрос SQL из lobodava :

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
--OR
exec (@sql)

Почему лободава выбрала exec sp_executesql @sql, а не exec(@sql) Так в чем здесь разница?
Лучше использовать sp_executesql on recursive dynamic queries?
В другом посте говорят, что sp_executesql большеВероятно, будет способствовать повторному использованию плана запроса ... Так что это помогает в такого рода запросах?

1 Ответ

12 голосов
/ 10 марта 2011

Поскольку EXEC sp_executesql будет кэшировать план запроса - EXEC не будет.Для получения дополнительной информации и очень хорошего чтения см .:

Кэширование запроса означает, что логистикав запросе временно сохраняются, и сделать его выполнение позже быстрее для него.

...