Saya telah membaca dan membaca MSDN, dll. Ok, jadi ini menandakan akhir dari sebuah batch.
Apa yang mendefinisikan batch? Saya tidak mengerti mengapa saya harus pergi ketika saya menempelkan banyak skrip untuk dijalankan pada saat yang bersamaan.
Saya tidak pernah mengerti GO. Adakah yang bisa menjelaskan hal ini dengan lebih baik dan kapan saya perlu menggunakannya (setelah berapa banyak atau jenis transaksi apa)?
Misalnya mengapa saya perlu GO setelah setiap pembaruan di sini:
UPDATE [Country]
SET [CountryCode] = 'IL'
WHERE code = 'IL'
GO
UPDATE [Country]
SET [CountryCode] = 'PT'
WHERE code = 'PT'
go
juga me-reset / membersihkandeclare @foo
deklarasi variabel - Saya mendapatkan Anda perlu mendeklarasikan kesalahan @foo , sampai saya mengomentarigo
.Jawaban:
GO
adalah tidak benar perintah TSQL.Alih-alih itu adalah perintah ke program klien tertentu yang terhubung ke server SQL (Sybase atau Microsoft - tidak yakin tentang apa yang dilakukan Oracle), memberi isyarat ke program klien bahwa sekumpulan perintah yang dimasukkan ke dalamnya sampai kebutuhan "pergi" untuk dikirim ke server untuk dieksekusi.
Mengapa / kapan Anda membutuhkannya?
GO di server MS SQL memiliki parameter "hitungan" - sehingga Anda dapat menggunakannya sebagai pintasan "ulangi N kali".
Pembaruan yang sangat besar mungkin mengisi log server SQL. Untuk menghindarinya, mereka mungkin perlu dipisahkan menjadi beberapa bagian yang lebih kecil melalui
go
.Dalam contoh Anda, jika pembaruan untuk satu set kode negara memiliki volume yang akan kehabisan ruang log, solusinya adalah dengan memisahkan setiap kode negara menjadi transaksi terpisah - yang dapat dilakukan dengan memisahkannya pada klien dengan
go
.Beberapa pernyataan SQL HARUS dipisahkan oleh GO dari pernyataan berikut agar berfungsi.
Misalnya, Anda tidak dapat menghapus tabel dan membuat ulang tabel dengan nama yang sama dalam satu transaksi, setidaknya di Sybase (ditto untuk membuat prosedur / pemicu):
sumber
GO
tidak "membuat transaksi untuk Anda". Jika Anda tidak menjalankan transaksi eksplisit, setiap pernyataan akan tetap membuat transaksinya sendiri. Ini sepenuhnya ortogonal. Jika Anda ingin membagi pembaruan yang lebih besar menjadi langkah-langkah yang lebih kecil, Anda masih dapat melakukannya dalam satu kelompok seperti padaWHILE @@ROWCOUNT > 0
pola umum .UPDATE T1 SET X =2;UPDATE T1 SET X =2;
akan dijalankan sebagai dua transaksi yang terpisah pula . PenambahanGO
sama sekali tidak ada bedanya. Dan juga jika Anda sedang menjalankan dalam transaksi eksplisit itu meliputi batch dan lagiGO
tidak ada bedanya.GO
sama sekali tidak ada hubungannya dengan transaksi sama sekali, dan membuat jawaban poin kedua tentang transaksi dan ukuran file log salah.GO
tidak akan berpengaruh apapun. Jawaban pertama dan ketiga benar. Selain itu, ada kalanya Anda perlu memisahkan pernyataan ke dalam kumpulan terpisah, misalnya Anda tidak bisa menambahkan kolom ke tabel dan kemudian menggunakan kolom itu nanti dalam kumpulan yang sama. (lanjutan)CREATE VIEW
, dll) harus berada dalam kelompoknya sendiri.GO
bukanlah pernyataan, itu pemisah batch.Blok yang dipisahkan oleh
GO
dikirim oleh klien ke server untuk diproses dan klien menunggu hasilnya.Misalnya, jika Anda menulis
DELETE FROM a DELETE FROM b DELETE FROM c
, ini akan dikirim ke server sebagai
3
kueri satu baris.Jika Anda menulis
DELETE FROM a GO DELETE FROM b GO DELETE FROM c
, ini akan dikirim ke server sebagai
3
kueri satu baris.GO
sendiri tidak pergi ke server (tidak ada permainan kata-kata). Ini adalah kata khusus sisi klien yang murni dan hanya dikenali olehSSMS
danosql
.Jika Anda akan menggunakan alat kueri khusus untuk mengirimkannya melalui koneksi, server bahkan tidak akan mengenalinya dan mengeluarkan kesalahan.
sumber
CREATE SCHEMA
); lain membutuhkan menjadi satu - satunya pernyataan dalam kelompok mereka (sepertiSET SHOWPLAN_XML ON
)Banyak perintah harus berada dalam kelompoknya sendiri, seperti
CREATE PROCEDURE
Atau, jika Anda menambahkan kolom ke tabel, maka kolom tersebut harus berada dalam kelompoknya sendiri. Jika Anda mencoba untuk PILIH kolom baru dalam batch yang sama gagal karena pada waktu parse / kompilasi kolom tidak ada.
GO digunakan oleh alat SQL untuk menyelesaikan ini dari satu skrip: ini bukan kata kunci SQL dan tidak dikenali oleh mesin.
Ini adalah 2 contoh konkret penggunaan batch sehari-hari.
Edit: Dalam contoh Anda, Anda tidak perlu GO ...
Edit 2, misalnya. Anda tidak dapat melepaskan, membuat, dan memberi izin dalam satu batch ... paling tidak, di mana akhir dari prosedur yang tersimpan?
IF OBJECT_ID ('dbo.uspDoStuff') IS NOT NULL DROP PROCEDURE dbo.uspDoStuff GO CREATE PROCEDURE dbo.uspDoStuff AS SELECT Something From ATable GO GRANT EXECUTE ON dbo.uspDoStuff TO RoleSomeOne GO
sumber
Terkadang ada kebutuhan untuk menjalankan perintah yang sama atau sekumpulan perintah berulang kali. Ini mungkin untuk memasukkan atau memperbarui data pengujian atau mungkin untuk membebani server Anda untuk pengujian kinerja. Apa pun kebutuhan, cara termudah untuk melakukannya adalah dengan menyiapkan loop sementara dan menjalankan kode Anda, tetapi di SQL 2005 ada cara yang lebih mudah untuk melakukannya.
Misalkan Anda ingin membuat tabel uji dan memuatnya dengan 1000 catatan. Anda dapat mengeluarkan perintah berikut dan itu akan menjalankan perintah yang sama 1000 kali:
CREATE TABLE dbo.TEST (ID INT IDENTITY (1,1), ROWID uniqueidentifier) GO INSERT INTO dbo.TEST (ROWID) VALUES (NEWID()) GO 1000
sumber: http://www.mssqltips.com/tip.asp?tip=1216
Selain itu, ini menandai "akhir" dari blok SQL (misalnya dalam prosedur tersimpan) ... Berarti Anda berada dalam status "bersih" lagi ... eG: Parameter yang digunakan dalam pernyataan sebelum kode disetel ulang ( tidak ditentukan lagi)
sumber
Seperti yang sudah dikatakan semua orang, "GO" bukanlah bagian dari T-SQL. "GO" adalah pemisah batch di SSMS , aplikasi klien yang digunakan untuk mengirimkan kueri ke database. Ini berarti bahwa variabel yang dideklarasikan dan variabel tabel tidak akan bertahan dari kode sebelum "GO" ke kode yang mengikutinya.
Faktanya, GO hanyalah kata default yang digunakan oleh SSMS. Ini dapat diubah dalam opsi jika Anda mau. Untuk sedikit kesenangan, ubah opsi di sistem orang lain untuk menggunakan "PILIH" sebagai pemisah batch, bukan "GO". Maafkan tawa kejam saya.
sumber
Ini digunakan untuk membagi blok logika. Kode Anda diinterpretasikan ke dalam baris perintah sql dan ini menunjukkan blok kode berikutnya.
Tetapi bisa juga digunakan sebagai pernyataan rekursif dengan nomor tertentu.
Mencoba:
Beberapa pernyataan harus dibatasi oleh GO:
use DB create view thisViewCreationWillFail
sumber