Kullanarak SQL Server'da bir saklı yordamda dinamik bir SQL komutu çalıştırmanın gerçek dünyadaki artıları ve eksileri nelerdir?
EXEC (@SQL)
karşı
EXEC SP_EXECUTESQL @SQL
?
Kullanarak SQL Server'da bir saklı yordamda dinamik bir SQL komutu çalıştırmanın gerçek dünyadaki artıları ve eksileri nelerdir?
EXEC (@SQL)
karşı
EXEC SP_EXECUTESQL @SQL
?
Yanıtlar:
sp_executesql
sorgu planının yeniden kullanımını teşvik etme olasılığı daha yüksektir. Kullanılırken sp_executesql
, parametreler çağıran imzada açıkça tanımlanır. Bu mükemmel makale bu süreci anlatmaktadır .
Dinamik sql'nin birçok yönü için sık sık alıntı yapılan referans Erland Sommarskog'un okuması gereken: " Dinamik SQL'in Laneti ve Kutsaması ".
SP_EXECUTESQL ile ilgili en önemli şey, SQL enjeksiyonunu önemsiyorsanız çok iyi olan parametreli sorgular oluşturmanıza izin vermesidir.
Microsoft'un sp_executesql kullanma makalesi sp_executesql
, execute
ifade yerine kullanılmasını önerir .
Bu saklı yordam parametre değiştirmeyi desteklediğinden , sp_executesql, EXECUTE'dan daha çok yönlüdür; ve sp_executesql, SQL Server tarafından yeniden kullanılma olasılığı daha yüksek olan yürütme planları ürettiğinden, sp_executesql, EXECUTE'dan daha etkilidir .
Yani, uzak take: kullanmayın Do execute
deyimi . Kullanın sp_executesql
.
sp_executesql
, yerine kullanılamayacak durumlar gördüm execute
. Belki de vurgulamaya çalıştığım noktayı şu şekilde ifade etmeliyim: Mümkün olduğuncasp_executesql
yerine kullanın . execute
Bu günlerde her zaman sp_executesql kullanırdım, gerçekten de parametreleri ve değişkenleri işleyen EXEC için bir sarmalayıcıdır.
Ancak, özellikle birden fazla veri tabanına yayılmış verilere sahip olduğunuz ve indeks taramalarını sınırlamak için bir KISITLAMA kullandığınız çok büyük veri tabanlarında sorguları ayarlarken OPTION RECOMPILE'ı unutmayın.
OPTION RECOMPILE kullanmadığınız sürece, SQL sunucusu sorgunuz için "herkese uyan tek boyut" yürütme planı oluşturmaya çalışır ve her çalıştırıldığında tam bir dizin taraması çalıştırır.
Bu, bir aramadan çok daha az etkilidir ve potansiyel olarak, sizin sorgulamadığınız aralıklarla sınırlandırılmış tüm dizinleri taradığı anlamına gelir: @
komutu çalıştır
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
dinamik SQL'de olamaz . @Sql'nin varchar
veya olarak ilan edildiğine dikkat edinnvarchar