ข้อดีข้อเสียในโลกแห่งความเป็นจริงของการเรียกใช้คำสั่ง SQL แบบไดนามิกในโพรซีเดอร์ที่เก็บไว้ใน SQL Server โดยใช้
EXEC (@SQL)
เทียบกับ
EXEC SP_EXECUTESQL @SQL
เหรอ?
ข้อดีข้อเสียในโลกแห่งความเป็นจริงของการเรียกใช้คำสั่ง SQL แบบไดนามิกในโพรซีเดอร์ที่เก็บไว้ใน SQL Server โดยใช้
EXEC (@SQL)
เทียบกับ
EXEC SP_EXECUTESQL @SQL
เหรอ?
คำตอบ:
sp_executesql
มีแนวโน้มที่จะส่งเสริมการใช้แผนแบบสอบถามซ้ำ เมื่อใช้sp_executesql
พารามิเตอร์จะถูกระบุอย่างชัดเจนในลายเซ็นการโทร บทความที่ยอดเยี่ยมนี้ไม่เข้าใจกระบวนการนี้
บ่อยครั้งที่อ้างถึงการอ้างอิงสำหรับหลายแง่มุมของไดนามิก sql เป็นสิ่งที่ต้องอ่านของ Erland Sommarskog: " The Curse and Blessings of Dynamic SQL "
สิ่งสำคัญเกี่ยวกับ SP_EXECUTESQL คือช่วยให้คุณสร้างการสืบค้นแบบกำหนดพารามิเตอร์ซึ่งเป็นสิ่งที่ดีมากหากคุณสนใจเกี่ยวกับการแทรก SQL
บทความการใช้ sp_executesqlของ Microsoft แนะนำให้ใช้sp_executesql
แทนexecute
คำสั่ง
เนื่องจากโพรซีเดอร์ที่เก็บไว้นี้สนับสนุนการทดแทนพารามิเตอร์ sp_executesql จึงมีความหลากหลายมากกว่า EXECUTE และเนื่องจาก sp_executesql สร้างแผนการดำเนินการที่มีแนวโน้มที่จะถูกนำกลับมาใช้โดย SQL Server sp_executesql จึงมีประสิทธิภาพมากกว่า EXECUTE
ดังนั้น Take Away: ไม่ได้ใช้execute
คำสั่ง ใช้sp_executesql
.
sp_executesql
ไม่สามารถใช้ทดแทนexecute
ได้ บางทีฉันควรวางจุดฉันพยายามที่จะเป็นความเครียด: ใช้sp_executesql
แทนเมื่อใดก็ตามที่เป็นไปได้execute
วันนี้ฉันมักจะใช้ sp_executesql ทั้งหมดที่เป็นกระดาษห่อหุ้มสำหรับ EXEC ซึ่งจัดการพารามิเตอร์และตัวแปร
อย่างไรก็ตามอย่าลืมเกี่ยวกับ OPTION RECOMPILE เมื่อปรับแต่งแบบสอบถามบนฐานข้อมูลขนาดใหญ่มากโดยเฉพาะอย่างยิ่งเมื่อคุณมีข้อมูลที่ครอบคลุมมากกว่าหนึ่งฐานข้อมูลและกำลังใช้ CONSTRAINT เพื่อ จำกัด การสแกนดัชนี
เว้นแต่คุณจะใช้ OPTION RECOMPILE เซิร์ฟเวอร์ SQL จะพยายามสร้างแผนการดำเนินการ "หนึ่งขนาดที่เหมาะกับทุกคน" สำหรับแบบสอบถามของคุณและจะเรียกใช้การสแกนดัชนีทั้งหมดทุกครั้งที่เรียกใช้
สิ่งนี้มีประสิทธิภาพน้อยกว่าการค้นหามากและหมายความว่ามันอาจสแกนดัชนีทั้งหมดซึ่ง จำกัด อยู่ในช่วงที่คุณไม่ได้ค้นหา: @
ดำเนินการคำสั่ง
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
อยู่ในไดนามิก SQL โปรดทราบว่า @sql ประกาศเป็นvarchar
หรือnvarchar