Jakie są rzeczywiste wady i zalety wykonywania dynamicznego polecenia SQL w procedurze składowanej w programie SQL Server przy użyciu
EXEC (@SQL)
przeciw
EXEC SP_EXECUTESQL @SQL
?
sql
sql-server
dynamic
Ash Machine
źródło
źródło
Artykuł Microsoftu Using sp_executesql zaleca używanie
sp_executesql
zamiastexecute
instrukcji.A więc na wynos: nie używaj
execute
instrukcji . Użyjsp_executesql
.źródło
sp_executesql
nie można ich zastąpićexecute
. Być może powinienem ująć to, co staram się podkreślić, jako: Używajsp_executesql
zamiast tego,execute
kiedy to możliwe .W dzisiejszych czasach zawsze używałbym sp_executesql, wszystko to naprawdę jest opakowaniem dla EXEC, które obsługuje parametry i zmienne.
Jednak nie zapomnij o OPCJI RECOMPILE podczas strojenia zapytań w bardzo dużych bazach danych, zwłaszcza gdy masz dane rozłożone na więcej niż jedną bazę danych i używasz OGRANICZENIA w celu ograniczenia skanowania indeksów.
O ile nie użyjesz OPCJI RECOMPILE, serwer SQL podejmie próbę utworzenia planu wykonania zapytania „jeden rozmiar dla wszystkich” i będzie przeprowadzał pełne skanowanie indeksu przy każdym uruchomieniu.
Jest to znacznie mniej wydajne niż wyszukiwanie i oznacza, że potencjalnie skanuje całe indeksy, które są ograniczone do zakresów, których nawet nie pytasz: @
źródło
wykonać polecenie
declare @sql varchar (100) set @sql ='select * from #td1' if (@IsMonday+@IsTuesday !='') begin set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )' end exec( @sql)
źródło
int
w dynamicznym języku SQL. Zauważ, że @sql jest zadeklarowane jakovarchar
lubnvarchar