Bạn không thể làm điều này mà không có SQL động vì một thủ tục được lưu trữ phải nằm trong lô riêng của nó. Do đó bạn không thể nói:
IF <some condition>
<start a new batch>
Cách duy nhất để giữ nó trong cùng một lô là sử dụng sp_executesql
.
Nếu bạn định viết kịch bản cho DROP
và CREATE
đồng thời, chỉ cần làm điều đó mà không cần kiểm tra sự tồn tại của đối tượng. Điều này sẽ cung cấp cho bạn:
DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
Ai quan tâm nếu DROP
không thành công? (Không nên, bởi vì bạn chỉ viết kịch bản từ nó!)
Nếu bạn đang viết tập lệnh này cho một hệ thống khác có thể có đối tượng, bạn sẽ nhận được thông báo lỗi cho DROP
khi nó không, nhưng CREATE
sẽ vẫn xảy ra, vì vậy bạn có thể bỏ qua DROP
các lỗi. Nếu bạn thực sự muốn, bạn có thể quấn DROP
theo cách thủ công câu lệnh trong TRY/CATCH
nhưng tôi không nghĩ nó cần thiết.
Nếu bạn cần thực hiện việc này cho nhiều quy trình hoặc nếu bạn thực sự cần quy trình để không tạo ra các lỗi lành tính, tôi khuyên bạn nên từ bỏ các tùy chọn tập lệnh ban đầu của Management Studio và sử dụng công cụ của bên thứ ba cho việc này. Họ đã giải quyết nhiều vấn đề mà bạn chưa gặp phải, nhưng sẽ làm được. Tôi đã viết blog về điều này:
http:// bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/