Saya membuat skrip untuk memigrasikan perubahan secara otomatis dari beberapa database pengembangan ke pementasan / produksi. Pada dasarnya, ini membutuhkan banyak perubahan-skrip, dan menggabungkannya menjadi satu skrip, membungkus setiap skrip dalam sebuah IF whatever BEGIN ... END
pernyataan.
Namun, beberapa skrip memerlukan GO
pernyataan sehingga, misalnya, parser SQL mengetahui tentang kolom baru setelah dibuat.
ALTER TABLE dbo.EMPLOYEE
ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO -- Necessary, or next line will generate "Unknown column: EMP_IS_ADMIN"
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
Namun, setelah saya membungkusnya dalam satu IF
blok:
IF whatever
BEGIN
ALTER TABLE dbo.EMPLOYEE ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
END
Gagal karena saya mengirim BEGIN
tanpa kecocokan END
. Namun, jika saya menghapusnya, GO
mengeluh lagi tentang kolom yang tidak diketahui.
Apakah ada cara untuk membuat dan memperbarui kolom yang sama dalam satu IF
blok?
sql
sql-server
tsql
sql-server-2008
BlueRaja - Danny Pflughoeft
sumber
sumber
GO
harus berada dalam satu baris dengan sendirinya, sehingga Anda dapat mencari kasus itu saja, dan tidak setiap kataGO
. 2) Anda selalu dapat mencatat pernyataan mana yang berhasil diselesaikan. Atau Anda dapat membungkus semuanya dalam coba / tangkap dan menggunakan nomor baris Anda sendiri menggunakan beberapa variabel, seperti @lineNo, yang Anda lacak, dan laporkan kesalahan. Karena Anda membuat ini secara otomatis, membuat perubahan seperti ini akan sangat mudah. Sepertinya Anda tidak ingin menjelajahi rute ini ketika menurut saya ada solusi yang dapat ditemukan untuk semua masalah Anda.Jawaban:
Saya mengalami masalah yang sama dan akhirnya berhasil menyelesaikannya menggunakan SET NOEXEC .
sumber
SQLCMD
Skrip Mode SS (yaitu skrip penerapan utama) yang memanggil (melalui:r
perintah) Skrip SS lainnya (yaitu skrip sub-penerapan) dengan beberapa panggilan tersebut di dalamif
Pernyataan. Jawaban Oded, mellamokb dan Andy Joiner yang menyertakan semua Pernyataan tersebut diexec
Panggilan /begin
-end
adalah bukan permulaan. Selain itu, metodebegin
-end
tidak akan berfungsi jika adacreate
Pernyataan (misalnya, memerlukan eksplisitgo
sebelumnya). Tapi, man, "Holy double negative, Batman!" ;)if
-block), saya akan mengawali blok dengan-- If whatever
Komentar, mengindentasi blok dan memposting blok dengan--end If whatever
Komentar.GO
bukan SQL - ini hanyalah pemisah batch yang digunakan di beberapa alat MS SQL.Jika Anda tidak menggunakannya, Anda perlu memastikan pernyataan dijalankan secara terpisah - baik dalam batch yang berbeda atau dengan menggunakan SQL dinamis untuk populasi (terima kasih @gbn):
sumber
IF
blok yang sama .;
bantuan di sini? - Anda baru saja mengedit jawaban Anda: o);
juga tidak berfungsi - parser masih memberi saya "Nama kolom tidak valid 'EMP_IS_ADMIN'."Anda dapat mencoba
sp_executesql
, membagi konten di antara setiapGO
pernyataan menjadi string terpisah untuk dieksekusi, seperti yang ditunjukkan pada contoh di bawah ini. Selain itu, ada variabel @statementNo untuk melacak pernyataan mana yang sedang dieksekusi untuk memudahkan proses debug di mana pengecualian terjadi. Nomor baris akan relatif terhadap awal nomor pernyataan relevan yang menyebabkan kesalahan.Anda juga dapat dengan mudah menjalankan pernyataan multi-baris, seperti yang ditunjukkan pada contoh di atas, hanya dengan menggabungkannya dalam tanda kutip tunggal (
'
). Jangan lupa untuk melepaskan tanda kutip tunggal yang terkandung di dalam string dengan tanda kutip tunggal ganda (''
) saat membuat skrip.sumber
SELECT * <newline> FROM whatever
. Jika saya mengeksekusi setiap baris dengan pernyataan EXEC-nya sendiri, itu akan rusak. Atau apakah Anda menyarankan saya melanggar setiapGO
pernyataan?Saya akhirnya membuatnya bekerja dengan mengganti setiap contoh
GO
pada barisnya sendiri denganIni sangat disukai daripada membungkus setiap kelompok pernyataan dalam sebuah string, tetapi masih jauh dari ideal. Jika ada yang menemukan solusi yang lebih baik, kirimkan dan saya akan menerimanya.
sumber
IF
blok). Sepertinya tidak ada cara yang baik untuk melakukan ini di SQL.set noexec
Jawaban Mina Jacob adalah SATU-SATUNYA Jawaban praktis sejauh ini untuk digunakan dalamSQLCMD
Skrip Mode SS (yaitu skrip penerapan utama) yang memanggil (melalui:r
perintah) Skrip SS lainnya (yaitu skrip sub-penerapan) dengan beberapa panggilan tersebut di dalamif
Pernyataan. Jawaban Oded, mellamokb, dan Andy Joiner yang menyertakan semua Pernyataan tersebut diexec
Panggilan /begin
-end
adalah bukan permulaan. Selain itu, metodebegin
-end
tidak akan berfungsi jika adacreate
Pernyataan (misalnya, memerlukan eksplisitgo
sebelumnya).Anda dapat menyertakan pernyataan di BEGIN dan END sebagai ganti peralihan GO
(Diuji pada database Northwind)
Sunting: (Mungkin diuji pada SQL2012)
sumber
set noexec
Jawaban Mina Jacob adalah SATU-SATUNYA Jawaban praktis sejauh ini untuk digunakan dalamSQLCMD
Skrip Mode SS (yaitu skrip penerapan utama) yang memanggil (melalui:r
perintah) Skrip SS lainnya (yaitu skrip sub-penerapan) dengan beberapa panggilan tersebut di dalamif
Pernyataan. Jawaban Oded, mellamokb, dan Andy Joiner yang menyertakan semua Pernyataan tersebut diexec
Panggilan /begin
-end
adalah bukan permulaan. Selain itu, metodebegin
-end
tidak akan berfungsi jika adacreate
Pernyataan (misalnya, memerlukan eksplisitgo
sebelumnya).Anda dapat mencoba solusi ini:
sumber
Saya telah menggunakan
RAISERROR
di masa lalu untuk inisumber
Anda dapat memasukkan pernyataan
GOTO
danLABEL
untuk melewati kode, sehingga membiarkanGO
kata kunci tetap utuh.sumber