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_executesqlsorgu 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, executeifade 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 executedeyimi . 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)
intdinamik SQL'de olamaz . @Sql'nin varcharveya olarak ilan edildiğine dikkat edinnvarchar