Như bạn có thể thấy, câu hỏi "tại sao" đòi hỏi một loại câu trả lời khác, bao gồm cả lý do lịch sử và các giả định cơ bản cho ngôn ngữ, tôi không chắc mình thực sự có thể thực hiện công lý đó.
Bài viết toàn diện này của SQL MVP Erland Sommarskog không cố gắng cung cấp một số lý do, cùng với các cơ chế:
Lời nguyền và phước lành của SQL động :
Gói bộ nhớ truy vấn
Mỗi truy vấn bạn chạy trong SQL Server yêu cầu một kế hoạch truy vấn. Khi bạn chạy truy vấn lần đầu tiên, SQL Server sẽ xây dựng một kế hoạch truy vấn cho nó - hoặc theo thuật ngữ - nó sẽ biên dịch truy vấn. SQL Server lưu kế hoạch trong bộ đệm và lần sau khi bạn chạy truy vấn, kế hoạch được sử dụng lại.
Điều này (và bảo mật, xem bên dưới) có lẽ là lý do lớn nhất.
SQL hoạt động với tiền đề rằng các truy vấn không phải là hoạt động một lần, mà chúng sẽ được sử dụng nhiều lần. Nếu bảng (hoặc cơ sở dữ liệu!) Không thực sự được chỉ định trong truy vấn, thì không có cách nào để tạo và lưu kế hoạch thực hiện để sử dụng trong tương lai.
Có, không phải mọi truy vấn chúng tôi chạy sẽ được sử dụng lại, nhưng đây là tiền đề hoạt động mặc định của SQL , vì vậy "ngoại lệ" có nghĩa là đặc biệt.
Một vài lý do khác mà danh sách Erland (lưu ý rằng anh ta liệt kê rõ ràng lợi thế của việc sử dụng các thủ tục được lưu trữ , nhưng nhiều trong số đó cũng là lợi thế của các truy vấn được tham số hóa (không động)):
- Hệ thống cấp phép : công cụ SQL không thể dự đoán liệu bạn có quyền chạy truy vấn hay không nếu nó không biết bảng (hoặc cơ sở dữ liệu) mà bạn sẽ hoạt động. "Chuỗi quyền" sử dụng SQL động là một nỗi đau ở mông.
- Giảm lưu lượng mạng : Truyền tên của Proc được lưu trữ và một vài giá trị tham số qua mạng ngắn hơn một câu lệnh truy vấn dài.
- Logic đóng gói : Bạn nên làm quen với những lợi thế của việc đóng gói logic từ các môi trường lập trình khác.
- Theo dõi những gì được sử dụng : Nếu tôi cần thay đổi một định nghĩa cột, làm thế nào tôi có thể tìm thấy tất cả các mã gọi nó? Các thủ tục hệ thống tồn tại để tìm các phụ thuộc trong cơ sở dữ liệu SQL, nhưng chỉ khi mã nằm trong các thủ tục được lưu trữ.
- Dễ viết mã SQL : Kiểm tra cú pháp xảy ra khi bạn tạo hoặc sửa đổi một thủ tục được lưu trữ, do đó hy vọng sẽ có ít lỗi hơn.
- Giải quyết các lỗi và vấn đề : Một DBA có thể theo dõi và đo lường hiệu suất của các thủ tục được lưu trữ riêng lẻ dễ dàng hơn nhiều so với SQL động thay đổi liên tục.
Một lần nữa, mỗi trong số chúng có một trăm sắc thái mà tôi sẽ không nhận được ở đây.