Quali sono i pro ei contro del mondo reale nell'esecuzione di un comando SQL dinamico in una stored procedure in SQL Server utilizzando
EXEC (@SQL)
contro
EXEC SP_EXECUTESQL @SQL
?
Quali sono i pro ei contro del mondo reale nell'esecuzione di un comando SQL dinamico in una stored procedure in SQL Server utilizzando
EXEC (@SQL)
contro
EXEC SP_EXECUTESQL @SQL
?
Risposte:
sp_executesql
è più probabile che promuova il riutilizzo del piano di query. Quando si utilizza sp_executesql
, i parametri vengono identificati esplicitamente nella firma chiamante. Questo eccellente articolo descrive questo processo .
Il riferimento spesso citato per molti aspetti dello sql dinamico è che Erland Sommarskog deve leggere: " The Curse and Blessings of Dynamic SQL ".
La cosa importante di SP_EXECUTESQL è che ti consente di creare query parametrizzate, il che è molto buono se ti interessa l'iniezione SQL.
L' articolo di Microsoft Using sp_executesql consiglia di utilizzare sp_executesql
invece di execute
statement.
Poiché questa stored procedure supporta la sostituzione dei parametri , sp_executesql è più versatile di EXECUTE; e poiché sp_executesql genera piani di esecuzione che hanno maggiori probabilità di essere riutilizzati da SQL Server, sp_executesql è più efficiente di EXECUTE.
Quindi, il take away: non usare la execute
dichiarazione . Usa sp_executesql
.
sp_executesql
non può essere utilizzato per sostituire execute
. Forse dovrei mettere il punto che sto cercando di sottolineare come: usa sp_executesql
invece di execute
quando possibile .
In questi giorni userei sempre sp_executesql, tutto ciò che è veramente è un wrapper per EXEC che gestisce parametri e variabili.
Tuttavia, non dimenticare OPTION RECOMPILE quando si ottimizzano le query su database di grandi dimensioni, soprattutto quando i dati si estendono su più di un database e si utilizza un CONSTRAINT per limitare le scansioni dell'indice.
A meno che non si utilizzi OPTION RECOMPILE, il server SQL tenterà di creare un piano di esecuzione "taglia unica" per la query ed eseguirà una scansione completa dell'indice ogni volta che viene eseguita.
Questo è molto meno efficiente di una ricerca e significa che potenzialmente sta scansionando interi indici che sono vincolati a intervalli che non stai nemmeno interrogando: @
eseguire il 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
in SQL dinamico. Nota che @sql è dichiarato come varchar
onvarchar