Di SQL Server, kapan Anda harus menggunakan GO dan kapan Anda harus menggunakan titik koma;?

100

Saya selalu bingung dengan kapan saya harus menggunakan kata kunci GO setelah perintah dan apakah titik koma diperlukan di akhir perintah. Apa perbedaannya dan mengapa / kapan saya harus menggunakannya?

Ketika saya menjalankan Generate-script di SQL Server Management Studio, tampaknya menggunakan GO di semua tempat, tetapi bukan titik koma.

Neraka
sumber
3
kemungkinan duplikat dari Apa perbedaan antara ";" dan "GO" di TSQL (SQL 2008)?
JohnFx

Jawaban:

93

GOhanya berhubungan dengan SSMS - ini bukan Transact SQL sebenarnya, ini hanya memberi tahu SSMS untuk mengirim pernyataan SQL di antara masing GO-masing batch secara berurutan.

Itu ;adalah pemisah pernyataan SQL, tetapi sebagian besar mesin dapat menafsirkan di mana pernyataan Anda dipecah.

Pengecualian utama, dan tempat di mana yang ;paling sering digunakan adalah sebelum Pernyataan Ekspresi Tabel Umum.

cjk
sumber
5
Penekanan pada GObukan Bagian T-SQL sementara ;adalah
msarchet
2
Sebuah MERGEpernyataan harus diakhiri dengan titik koma.
onedaywhen
15
Pembaruan: di SQL Server 2012 TIDAK menggunakan titik koma tidak digunakan lagi, yang berarti mereka akan diperlukan di versi berikutnya. Jadi adalah praktik yang baik untuk menggunakan titik koma, karena akan membutuhkan lebih sedikit pekerjaan jika terjadi migrasi (dan karena ini adalah standar). Sumber: technet.microsoft.com/en-us/library/ms143729.aspx atau buku di SQL Server 2012: shop.oreilly.com/product/0790145321978.do
Paweł Bulwan
1
SQL 2014 masih mencantumkan titik koma yang diperlukan untuk versi berikutnya. Saya bertanya-tanya kapan itu akan dihentikan. technet.microsoft.com/en-us/library/ms143729.aspx
Frank
2
+ buli tidak menyatakan bahwa ;tidak berlaku lagi, TIDAK menggunakannya sudah usang, yaitu akan menjadi wajib menurut sumbernya.
cjk
78

Alasan mengapa Anda melihat begitu banyak GO dalam skrip DDL yang Dihasilkan adalah karena aturan berikut tentang batch.

BUAT DEFAULT, BUAT FUNGSI, BUAT PROSEDUR, BUAT ATURAN, BUAT PEMICU, dan BUAT TAMPILAN pernyataan tidak dapat digabungkan dengan pernyataan lain dalam satu kelompok. Pernyataan CREATE harus memulai kelompok. Semua pernyataan lain yang mengikuti kelompok itu akan ditafsirkan sebagai bagian dari definisi pernyataan CREATE pertama.

Salah satu kasus penggunaan untuk Generated DDL adalah untuk menghasilkan banyak objek dalam satu file. Karena itu, generator DDL harus dapat menghasilkan batch. Seperti yang dikatakan orang lain, pernyataan GO mengakhiri batch.

Conrad Frix
sumber
10
Ini adalah satu-satunya yang benar-benar menjawab "... kapan Anda harus menggunakan GO ...?" bagian dari pertanyaan.
Roimer
Tampak bagi saya bahwa GO menghentikan pernyataan yang membuat objek yang berisi SQL yang mungkin berisi; pernyataan terminator. Di DBMS lain saya telah melihat kemampuan untuk mengatur string terminasi. Misalnya, Anda mungkin menetapkan pernyataan yang diakhiri dengan dua karakter pipa ||. Anda kemudian dapat menerbitkan PROSEDUR BUAT ... banyak SQL yang diakhiri dengan; ... || dan pipa ganda mengakhiri pernyataan CREATE PROCEDURE. Jadi pertanyaan saya adalah apakah ini sejalan dengan pernyataan MS GO? Kedua, dapatkah Anda mendefinisikan ulang string terminasi di SQLSERVER?
youcantryreachingme
@youcantryreachingme Saya tidak tahu apakah ini benar pada tahun 2010 tetapi tampaknya Anda bisa. Lihat SSMS: Pemisah Batch . Saya tidak yakin apa batasannya
Conrad Frix
34

PERGILAH

Go adalah pemisah batch. Ini berarti bahwa semua yang ada di batch itu bersifat lokal ke batch tersebut.

Deklarasi Variabel, Variabel Tabel, dll. Tidak melewati GOpernyataan.

Tabel #Temp bersifat lokal ke suatu koneksi, sehingga mencakup seluruh pernyataan GO.

Titik koma

Titik koma adalah terminator pernyataan. Ini murni digunakan untuk mengidentifikasi bahwa pernyataan tertentu telah berakhir.

Dalam kebanyakan kasus, sintaks pernyataan itu sendiri sudah cukup untuk menentukan akhir pernyataan.

Namun CTE, menuntut bahwa WITH adalah pernyataan pertama sehingga Anda memerlukan titik koma sebelum WITH.

Raj Lebih
sumber
4
Sebuah MERGEpernyataan harus diakhiri dengan titik koma.
onedaywhen
11

Anda harus menggunakan titik koma untuk menghentikan setiap pernyataan SQL. Ini didefinisikan dalam Standar SQL,

Tentu, lebih sering daripada tidak SQL Server memungkinkan Anda untuk menghilangkan terminator pernyataan tetapi mengapa menjadi kebiasaan buruk?

Seperti yang ditunjukkan orang lain, pernyataan yang mendahului ekspresi tabel umum (CTE) harus diakhiri dengan titik koma. Akibatnya, dari orang-orang yang belum sepenuhnya menggunakan terminator titik koma, kami melihat ini:

;WITH ...

yang menurut saya terlihat sangat aneh. Saya kira masuk akal di forum online ketika Anda tidak dapat mengetahui kualitas kode yang akan ditempelkan.

Selain itu, MERGEpernyataan harus diakhiri dengan titik koma. Apakah Anda melihat pola di sini? Ini adalah beberapa tambahan baru untuk TSQL yang mengikuti Standar SQL. Sepertinya tim SQL Server sedang menjalankan mandat penggunaan terminator titik koma.

onedaywhen
sumber
2
" yang menurut saya terlihat sangat aneh " - Saya sangat setuju. Dan pengulangan terus-menerus ini mengarah pada pertanyaan aneh seperti ini atau ini
a_horse_with_no_name
SQL Server tidak mengizinkan Anda untuk menjadi ceroboh - ini memungkinkan Anda untuk menghilangkan terminator pernyataan yang berlebihan; T-SQL, seperti kebanyakan SQL lainnya, bukanlah SQL standar murni, yang lebih seperti kelas dasar abstrak - tidak digunakan dalam praktik demi dialek mesin DB itu sendiri.
ProfK
@ProfK: terima kasih telah mencantumkan tanda baca pada komentar anda, sehingga memudahkan saya untuk membaca dan memahaminya, terutama karakter terminator kalimatnya. Meskipun, penggunaan tanda hubung Anda tidak sesuai dengan standar bahasa Inggris ...
onedaywhen
8

GO adalah terminator batch, titik koma adalah terminator pernyataan.

Anda akan menggunakan GO jika Anda ingin memiliki beberapa pernyataan create proc dalam 1 skrip karena create proc harus menjadi pernyataan pertama dalam sebuah batch. Jika Anda menggunakan ekspresi tabel umum maka pernyataan sebelumnya harus diakhiri dengan titik koma

SQLMenace
sumber
Sebuah MERGEpernyataan harus diakhiri dengan titik koma.
onedaywhen