GO bukan perintah T-SQL. Adalah pembatas batch. Alat klien (SSM, sqlcmd, osql dll) menggunakannya untuk memotong secara efektif file di setiap GO dan kirim ke server batch individu. Jadi jelas Anda tidak dapat menggunakan GO di dalam IF, Anda juga tidak dapat mengharapkan variabel untuk menjangkau cakupan lintas batch.
Selain itu, Anda tidak dapat menangkap pengecualian tanpa memeriksa XACT_STATE()
untuk memastikan transaksi tidak gagal.
Menggunakan GUID untuk ID setidaknya selalu mencurigakan.
Menggunakan batasan NOT NULL dan menyediakan 'panduan' default seperti '{00000000-0000-0000-0000-000000000000}'
juga tidak mungkin benar.
Diperbarui:
- Pisahkan ALTER dan UPDATE menjadi dua kelompok.
- Gunakan ekstensi sqlcmd untuk memecahkan skrip saat error. Ini didukung oleh SSMS saat mode sqlcmd aktif , sqlcmd, dan juga sepele untuk mendukungnya di pustaka klien:dbutilsqlcmd .
- gunakan
XACT_ABORT
untuk memaksa kesalahan untuk mengganggu batch. Ini sering digunakan dalam skrip pemeliharaan (perubahan skema). Prosedur tersimpan dan skrip logika aplikasi secara umum menggunakan blok TRY-CATCH sebagai gantinya, tetapi dengan hati-hati:Penanganan pengecualian dan transaksi bertingkat .
contoh skrip:
:on error exit
set xact_abort on;
go
begin transaction;
go
if columnproperty(object_id('Code'), 'ColorId', 'AllowsNull') is null
begin
alter table Code add ColorId uniqueidentifier null;
end
go
update Code
set ColorId = '...'
where ...
go
commit;
go
Hanya skrip yang berhasil yang akan mencapai COMMIT
. Kesalahan apa pun akan membatalkan skrip dan mengembalikan.
Saya menggunakan COLUMNPROPERTY
untuk memeriksa keberadaan kolom, Anda dapat menggunakan metode apa pun yang Anda suka (mis. cari sys.columns
).