Câu trả lời:
sp_executesql
có nhiều khả năng thúc đẩy việc tái sử dụng kế hoạch truy vấn. Khi sử dụng sp_executesql
, các tham số được xác định rõ ràng trong chữ ký gọi. Bài báo xuất sắc này mô tả quá trình này .
Tài liệu tham khảo được trích dẫn cho nhiều khía cạnh của sql động là Erland Sommarskog's phải đọc: " Lời nguyền và phước lành của SQL động ".
Điều quan trọng về SP_EXECUTESQL là nó cho phép bạn tạo các truy vấn được tham số hóa, điều này rất tốt nếu bạn quan tâm đến SQL injection.
Bài viết Sử dụng sp_executesql của Microsoft khuyến nghị sử dụng sp_executesql
thay vì execute
câu lệnh.
Bởi vì thủ tục được lưu trữ này hỗ trợ thay thế tham số , sp_executesql linh hoạt hơn EXECUTE; và vì sp_executesql tạo các kế hoạch thực thi có nhiều khả năng được sử dụng lại bởi SQL Server, sp_executesql hiệu quả hơn EXECUTE.
Vì vậy, lấy đi: Đỗ không sử dụng execute
tuyên bố . Sử dụng sp_executesql
.
sp_executesql
không dùng được để thay thế execute
. Có lẽ tôi nên đặt vấn đề mà tôi đang cố gắng nhấn mạnh là: Sử dụng sp_executesql
thay vì execute
bất cứ khi nào có thể .
Tôi luôn sử dụng sp_executesql những ngày này, tất cả những gì nó thực sự là một trình bao bọc cho EXEC xử lý các tham số & biến.
Tuy nhiên, đừng quên OPTION RECOMPILE khi điều chỉnh các truy vấn trên cơ sở dữ liệu rất lớn, đặc biệt khi bạn có dữ liệu trải dài trên nhiều cơ sở dữ liệu và đang sử dụng CONSTRAINT để hạn chế việc quét chỉ mục.
Trừ khi bạn sử dụng OPTION RECOMPILE, máy chủ SQL sẽ cố gắng tạo kế hoạch thực thi "một kích thước phù hợp với tất cả" cho truy vấn của bạn và sẽ chạy quét chỉ mục đầy đủ mỗi khi nó được chạy.
Điều này kém hiệu quả hơn nhiều so với tìm kiếm và có nghĩa là nó có khả năng quét toàn bộ các chỉ mục bị giới hạn trong phạm vi mà bạn thậm chí không truy vấn: @
thực hiện lệnh
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
ở trong SQL động. Lưu ý rằng @sql được khai báo là varchar
hoặcnvarchar