Anda tidak dapat melakukan ini tanpa SQL dinamis karena prosedur tersimpan harus dalam kumpulannya sendiri. Oleh karena itu Anda tidak dapat mengatakan:
IF <some condition>
<start a new batch>
Satu-satunya cara untuk menyimpannya dalam kumpulan yang sama adalah dengan menggunakan sp_executesql
.
Jika Anda akan membuat skrip DROP
dan CREATE
secara bersamaan, lakukan saja tanpa memeriksa keberadaan objek. Ini akan memberi Anda:
DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
Siapa yang peduli jika DROP
gagal? (Seharusnya tidak, karena Anda baru saja membuat skrip darinya!)
Jika Anda membuat skrip ini untuk sistem lain yang mungkin memiliki objek, Anda akan mendapatkan pesan kesalahan untuk DROP
ketika tidak, tetapi CREATE
akan tetap terjadi, jadi Anda dapat mengabaikan DROP
kesalahan. Jika Anda benar-benar ingin, Anda dapat secara manual membungkus DROP
pernyataan dalam TRY/CATCH
tapi menurut saya itu tidak perlu.
Jika Anda perlu melakukan ini untuk banyak prosedur, atau jika Anda benar-benar membutuhkan proses untuk tidak menghasilkan kesalahan jinak, saya sarankan Anda mengabaikan opsi skrip primitif Management Studio dan menggunakan alat pihak ke-3 untuk ini. Mereka pasti sudah menangani banyak masalah yang belum Anda temui, tetapi akan. Saya membuat blog tentang ini:
http:// bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/