Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Tambahkan kolom ke tabel dan kemudian perbarui di dalam transaksi

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 ).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Penggantian ISNUMERIC() yang efisien di SQL Server?

  2. Ekstrak nilai angka pertama dari string sql

  3. Pemetaan Titik Geospasial di Lancar NHibernate

  4. Cara Mengubah Tingkat Kompatibilitas Database dengan T-SQL

  5. Tabel kalender untuk Data Warehouse