อย่างที่คุณเห็นคำถาม "ทำไม" ต้องใช้คำตอบที่แตกต่างกันรวมถึงเหตุผลทางประวัติศาสตร์และสมมติฐานพื้นฐานสำหรับภาษาฉันไม่แน่ใจว่าฉันจะสามารถทำสิ่งนั้นได้จริง
บทความที่ครอบคลุมโดย SQL MVP Erland Sommarskog พยายามให้เหตุผลบางอย่างพร้อมกับกลไก:
คำสาปและพรของ Dynamic SQL :
แผนการแคชแบบสอบถาม
แบบสอบถามทั้งหมดที่คุณเรียกใช้ใน SQL Server ต้องมีแผนแบบสอบถาม เมื่อคุณเรียกใช้คิวรีในครั้งแรก SQL Server จะสร้างแผนคิวรีสำหรับแบบสอบถามหรือเป็นคำศัพท์ที่ใช้ไปซึ่งจะรวบรวมคิวรี SQL Server บันทึกแผนในแคชและครั้งถัดไปที่คุณเรียกใช้แบบสอบถามแผนจะถูกนำมาใช้ใหม่
นี่ (และความปลอดภัยดูด้านล่าง) น่าจะเป็นเหตุผลที่ดีที่สุด
SQL ทำงานภายใต้สมมติฐานที่ว่าการสืบค้นไม่ใช่การดำเนินการเพียงครั้งเดียว แต่จะมีการใช้แบบสอบถามซ้ำไปซ้ำมา หากไม่มีการระบุตาราง (หรือฐานข้อมูล!) ในแบบสอบถามจริง ๆ ไม่มีวิธีการสร้างและบันทึกแผนการดำเนินการสำหรับการใช้งานในอนาคต
ใช่ไม่ใช่ทุกคำถามที่เราเรียกใช้จะถูกนำมาใช้ใหม่ แต่นี่คือหลักฐานการดำเนินงานเริ่มต้นของ SQLดังนั้น "ข้อยกเว้น" จึงมีความพิเศษ
เหตุผลอื่น ๆ อีกสองสามรายการ Erland (โปรดทราบว่าเขาแสดงรายการข้อดีของการใช้กระบวนงานที่เก็บไว้อย่างชัดเจนแต่สิ่งเหล่านี้ส่วนใหญ่เป็นข้อดีของแบบสอบถามแบบใช้พารามิเตอร์ (ไม่ใช่แบบไดนามิก):
- ระบบอนุญาต : เครื่องมือ SQL ไม่สามารถคาดการณ์ได้ว่าคุณมีสิทธิ์ในการเรียกใช้แบบสอบถามหรือไม่หากไม่ทราบว่ามีตาราง (หรือฐานข้อมูล) ที่คุณจะใช้งาน "โซ่สิทธิ์" โดยใช้ไดนามิก SQL เป็นความเจ็บปวดในก้น
- การลดปริมาณการใช้เครือข่าย : การส่งชื่อของ proc ที่เก็บไว้และค่าพารามิเตอร์สองสามตัวบนเครือข่ายนั้นสั้นกว่าคำสั่งการสืบค้นแบบยาว
- Encapsulating Logic : คุณควรคุ้นเคยกับข้อดีของการห่อหุ้มตรรกะจากสภาพแวดล้อมการเขียนโปรแกรมอื่น ๆ
- การติดตามสิ่งที่ใช้ : หากฉันต้องการเปลี่ยนคำจำกัดความของคอลัมน์ฉันจะค้นหารหัสทั้งหมดที่เรียกได้อย่างไร กระบวนการของระบบมีอยู่เพื่อค้นหาการอ้างอิงภายในฐานข้อมูล SQL แต่ถ้ารหัสอยู่ในกระบวนงานที่เก็บไว้
- ความง่ายในการเขียนรหัส SQL : การตรวจสอบไวยากรณ์เกิดขึ้นเมื่อคุณสร้างหรือแก้ไขขั้นตอนการจัดเก็บดังนั้นหวังว่าจะเกิดข้อผิดพลาดน้อยลง
- การจัดการข้อบกพร่องและปัญหา : DBA สามารถติดตามและวัดประสิทธิภาพของขั้นตอนการจัดเก็บแต่ละรายการได้ง่ายกว่า SQL แบบไดนามิกที่เปลี่ยนแปลงตลอดเวลา
อีกครั้งสิ่งเหล่านี้มีความแตกต่างเป็นร้อยที่ฉันจะไม่เข้าไปที่นี่