Quais são os prós e contras do mundo real de executar um comando SQL dinâmico em um procedimento armazenado no SQL Server usando
EXEC (@SQL)
versus
EXEC SP_EXECUTESQL @SQL
?
Quais são os prós e contras do mundo real de executar um comando SQL dinâmico em um procedimento armazenado no SQL Server usando
EXEC (@SQL)
versus
EXEC SP_EXECUTESQL @SQL
?
Respostas:
sp_executesql
é mais provável que promova a reutilização do plano de consulta. Ao usar sp_executesql
, os parâmetros são identificados explicitamente na assinatura de chamada. Este excelente artigo descreve esse processo .
A referência freqüentemente citada para muitos aspectos do sql dinâmico é a leitura obrigatória de Erland Sommarskog: " The Curse and Blessings of Dynamic SQL ".
A grande vantagem do SP_EXECUTESQL é que ele permite que você crie consultas parametrizadas, o que é muito bom se você se preocupa com injeção de SQL.
O artigo Usando sp_executesql da Microsoft recomenda o uso em sp_executesql
vez da execute
instrução.
Como esse procedimento armazenado oferece suporte à substituição de parâmetro , sp_executesql é mais versátil que EXECUTE; e como sp_executesql gera planos de execução com maior probabilidade de serem reutilizados pelo SQL Server, sp_executesql é mais eficiente que EXECUTE.
Portanto, a conclusão: Não use execute
declaração . Use sp_executesql
.
sp_executesql
que não pode ser usado para substituir execute
. Talvez eu deva colocar o ponto que estou tentando enfatizar como: Use em sp_executesql
vez de execute
sempre que possível .
Eu sempre usaria sp_executesql atualmente, tudo o que realmente é é um invólucro para EXEC que lida com parâmetros e variáveis.
No entanto, não se esqueça de OPTION RECOMPILE ao ajustar consultas em bancos de dados muito grandes, especialmente quando você tiver dados estendidos por mais de um banco de dados e estiver usando CONSTRAINT para limitar as varreduras de índice.
A menos que você use OPTION RECOMPILE, o SQL server tentará criar um plano de execução "tamanho único" para sua consulta e executará uma varredura completa do índice cada vez que for executado.
Isso é muito menos eficiente do que uma busca e significa que está potencialmente verificando índices inteiros que são restritos a intervalos que você nem mesmo está consultando: @
execute o comando
declare @sql varchar (100)
set @sql ='select * from #td1'
if (@IsMonday+@IsTuesday !='')
begin
set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )'
end
exec( @sql)
int
em SQL dinâmico. Observe que @sql é declarado como varchar
ounvarchar