Kapan saya harus menggunakan titik koma di SQL Server?

221

Saat memeriksa beberapa kode di web dan skrip yang dihasilkan oleh SQL Server Management Studio, saya perhatikan bahwa beberapa pernyataan diakhiri dengan tanda titik koma.

Jadi kapan saya harus menggunakannya?

Anwar Pinto
sumber
23
SQL Server 2008 R2 msdn.microsoft.com/en-us/library/ms177563.aspx "Konvensi Transact-SQL Syntax (Transact-SQL)" ; == terminator pernyataan Transact-SQL. Meskipun titik koma tidak diperlukan untuk sebagian besar pernyataan dalam versi SQL Server ini, itu akan diperlukan di versi masa depan .
gerryLowry
2
Meskipun mereka mengklaim bahwa titik koma akan diperlukan di versi masa depan ini tidak akan pernah menjadi kenyataan. Mereka tidak pernah bisa mengamanatkan itu untuk alasan kompatibilitas. Itu akan merusak sekitar 100% aplikasi.
usr
1
Sekarang 2019 dan tidak ada tanda titik koma yang masih diterima dengan senang hati di versi terbaru dari SQL Server. Seperti yang dikatakan @usr, kecuali Microsoft ingin melakukan 100% pembersihan, tidak ada cara mereka dapat menegakkan ini.
Ian Kemp

Jawaban:

152

Dari artikel SQLServerCentral.Com oleh Ken Powers:

Titik koma

Karakter titik koma adalah terminator pernyataan. Ini adalah bagian dari standar ANSI SQL-92, tetapi tidak pernah digunakan dalam Transact-SQL. Memang, itu mungkin untuk kode T-SQL selama bertahun-tahun tanpa pernah menemui titik koma.

Pemakaian

Ada dua situasi di mana Anda harus menggunakan titik koma. Situasi pertama adalah di mana Anda menggunakan Common Table Expression (CTE), dan CTE bukan pernyataan pertama dalam kumpulan. Yang kedua adalah di mana Anda mengeluarkan pernyataan Broker Layanan dan pernyataan Broker Layanan bukanlah pernyataan pertama dalam kumpulan.

TheTXI
sumber
9
Apakah THROWpernyataan Broker Layanan? Kita perlu memasukkan titik koma sebelum dilemparkan ke dalam contoh ini:BEGIN ;THROW @Error, 'Invalid FundingID', 2; RETURN END
Chris Walsh
1
Tampaknya mereka pada dasarnya mendorong penggunaan titik koma secara umum, dengan mewajibkannya sebelum semua jenis pernyataan baru yang telah diperkenalkan dalam beberapa tahun terakhir. ( MERGEjuga misalnya). Sebagaimana disebutkan dalam jawaban lain, dalam standar ANSI mereka diminta
Mark Sowul
2
@maurocam Saya pikir Anda salah membaca dokumen. Jika Anda melihat tautan itu, tertulis " Tidak mengakhiri pernyataan Transact-SQL dengan titik koma." sudah ditinggalkan.
Caltor
Seperti yang saya lihat, ini tidak benar-benar menjawab pertanyaan kapan seseorang harus (bukannya harus ) menggunakan tanda titik koma.
Stewart
81

Secara default, pernyataan SQL diakhiri dengan titik koma. Anda menggunakan titik koma untuk mengakhiri pernyataan kecuali Anda (jarang) menetapkan terminator pernyataan baru.

Jika Anda hanya mengirim satu pernyataan, secara teknis Anda dapat membuang terminator pernyataan; dalam skrip, saat Anda mengirim lebih dari satu pernyataan, Anda memerlukannya.

Dalam praktiknya, selalu sertakan terminator meskipun Anda hanya mengirim satu pernyataan ke database.

Sunting: dalam menanggapi mereka yang mengatakan terminator pernyataan tidak diperlukan oleh [RDBMS tertentu], sementara itu mungkin benar, mereka diharuskan oleh Standar SQL ANSI. Dalam semua pemrograman, jika kita dapat mematuhi Standar tanpa kehilangan fungsionalitas, kita harus melakukannya, karena dengan demikian kode kita atau kebiasaan kita tidak terikat pada satu vendor hak milik.

Dengan beberapa kompiler C, dimungkinkan untuk memiliki pengembalian kembali utama, meskipun Standar mengharuskan utama untuk mengembalikan int. Tetapi melakukan hal itu membuat kode kita, dan diri kita sendiri, kurang mudah dibawa-bawa.

Kesulitan terbesar dalam pemrograman secara efektif adalah tidak mempelajari hal-hal baru, itu tidak mempelajari kebiasaan buruk. Sejauh kita dapat menghindari kebiasaan buruk sejak awal, itu merupakan kemenangan bagi kita, untuk kode kita, dan bagi siapa saja yang membaca atau menggunakan kode kita.

tpdi
sumber
25

Anda harus menggunakannya.

Praktek menggunakan titik koma untuk mengakhiri pernyataan adalah standar dan pada kenyataannya merupakan persyaratan di beberapa platform basis data lainnya. SQL Server hanya memerlukan titik koma dalam kasus tertentu — tetapi dalam kasus di mana titik koma tidak diperlukan, menggunakan titik koma tidak menyebabkan masalah. Saya sangat menyarankan agar Anda mengadopsi praktik penghentian semua pernyataan dengan titik koma. Tidak hanya melakukan ini akan meningkatkan keterbacaan kode Anda, tetapi dalam beberapa kasus dapat menghemat beberapa kesedihan. (Ketika titik koma diperlukan dan tidak ditentukan, pesan kesalahan yang dihasilkan SQL Server tidak selalu sangat jelas.)

Dan yang paling penting:

Dokumentasi SQL Server menunjukkan bahwa tidak mengakhiri pernyataan T-SQL dengan titik koma adalah fitur yang sudah usang. Ini berarti bahwa tujuan jangka panjang adalah untuk menegakkan penggunaan titik koma dalam versi produk yang akan datang. Itulah satu alasan lagi untuk membiasakan diri mengakhiri semua pernyataan Anda, bahkan di mana saat ini tidak diperlukan.

Sumber: Dasar-dasar T-SQL Microsoft SQL Server 2012 oleh Itzik Ben-Gan.


Contoh mengapa Anda selalu harus menggunakan ;adalah dua kueri berikut (disalin dari pos ini ):

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE()
    THROW
END CATCH

masukkan deskripsi gambar di sini

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException;
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE();
    THROW
END CATCH

masukkan deskripsi gambar di sini

Gotqn
sumber
7
Ini tampaknya menjadi argumen yang kuat bahwa Anda harus menggunakan titik koma (didukung oleh tanda kutip), tetapi hanya satu kasus di mana ada keharusan .
Gregor Thomas
3
@ Gregor, jika diumumkan bahwa menggunakan titik koma adalah not using themteknik yang harus dan sudah usang Anda harus menggunakannya. Jika tidak, ada risiko untuk menderita di masa depan. Jika Anda tidak berencana untuk meningkatkan / beralih pekerjaan dan akan selalu bekerja dengan SQL Server 2000 Anda aman :-)
Gotqn
5
Benar, seharusnya , saya setuju. Tapi dia baris pertama dari jawaban Anda menekankan harus , yang tidak terjadi --- setidaknya belum.
Gregor Thomas
2
Contoh dengan titik koma menghasilkan Incorrect syntax near 'THROW'.SQL Server 2008 (10.0.6241.0), yang merupakan versi yang harus saya tangani di tempat kerja. Ini berfungsi seperti yang ditunjukkan pada 2012. Saya telah diyakinkan untuk mulai menggunakan titik koma karena penghinaan. Saya tidak berharap itu akan menjadi masalah pada 2008 sebagian besar waktu.
Pilot_51
1
Jawaban Anda adalah yang terbaik sejauh ini! Ini layak mendapatkan lebih banyak upvotes.
Stewart
22

Jika saya membaca ini dengan benar, itu akan menjadi persyaratan untuk menggunakan titik koma untuk mengakhiri pernyataan TSQL. http://msdn.microsoft.com/en-us/library/ms143729%28v=sql.120%29.aspx

EDIT: Saya menemukan plug-in untuk SSMS 2008R2 yang akan memformat skrip Anda dan menambahkan titik koma. Saya pikir itu masih dalam versi beta ...

http://www.tsqltidy.com/tsqltidySSMSAddin.aspx

EDIT: Saya menemukan alat / plugin gratis yang lebih baik bernama ApexSQL ... http://www.apexsql.com/

Spidermain50
sumber
11

Pendapat pribadi: Gunakan hanya jika diperlukan. (Lihat jawaban TheTXI di atas untuk daftar yang diperlukan.)

Karena kompiler tidak memerlukannya, Anda dapat meletakkan semuanya, tetapi mengapa? Kompiler tidak akan memberi tahu Anda di mana Anda lupa satu, sehingga Anda akan berakhir dengan penggunaan yang tidak konsisten.

[Pendapat ini khusus untuk SQL Server. Database lain mungkin memiliki persyaratan yang lebih ketat. Jika Anda menulis SQL untuk dijalankan pada banyak basis data, persyaratan Anda mungkin beragam.]

tpdi yang dinyatakan di atas, "dalam naskah, karena Anda mengirim lebih dari satu pernyataan, Anda memerlukannya." Itu sebenarnya tidak benar. Anda tidak membutuhkannya.

PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional';
PRINT 'Semicolons are optional';

Keluaran:

Semicolons are optional
Semicolons are optional
Semicolons are optional
Semicolons are optional
Rob Garrison
sumber
1
Apa pendapat Anda tentang diskusi ini? sqlservercentral.com/Forums/Topic636549-8-1.aspx (Yoy dapat menggunakan [email protected]: bugmenot jika Anda tidak memiliki akun)
Anwar Pinto
2
Saya menghargai bahwa Anda menyatakan dengan jelas ini hanya pendapat Anda, namun saya tidak berpikir itu membuat jawaban yang baik karena bertentangan dengan dokumentasi Microsoft dan standar ANSI. Saya akan berpikir pendapat ini akan lebih baik dalam komentar. (Tidak mencoba menampar Anda, Anda sepenuhnya berhak atas pendapat Anda tentang penggunaan semi-colon!)
izzy
4

Saya masih harus banyak belajar tentang T-SQL, tetapi dalam mengerjakan beberapa kode untuk transaksi (dan mendasarkan kode pada contoh-contoh dari stackoverflow dan situs-situs lain), saya menemukan sebuah kasus di mana sepertinya tanda titik koma diperlukan dan jika ada yang hilang, pernyataan itu tampaknya tidak mengeksekusi sama sekali dan tidak ada kesalahan yang muncul. Ini sepertinya tidak tercakup dalam jawaban di atas. (Ini menggunakan MS SQL Server 2012.)

Setelah transaksi berhasil seperti yang saya inginkan, saya memutuskan untuk mencoba-coba sehingga jika ada kesalahan itu dibatalkan. Hanya setelah melakukan ini, transaksi tidak dilakukan (SSMS mengonfirmasi hal ini ketika mencoba untuk menutup jendela dengan pesan yang bagus yang mengingatkan Anda akan fakta bahwa ada transaksi yang tidak terikat.

Jadi ini

COMMIT TRANSACTION 

di luar blok BEGIN TRY / END TRY bekerja dengan baik untuk melakukan transaksi, tetapi di dalam blok itu harus

COMMIT TRANSACTION;

Perhatikan bahwa tidak ada kesalahan atau peringatan yang diberikan dan tidak ada indikasi bahwa transaksi masih tidak berkomitmen sampai mencoba untuk menutup tab permintaan.

Untungnya ini menyebabkan masalah yang sangat besar sehingga segera jelas bahwa ada masalah. Sayangnya karena tidak ada kesalahan (sintaks atau lainnya) yang dilaporkan, tidak segera jelas apa masalahnya.

Sebaliknya, TRANSAKSI ROLLBACK tampaknya bekerja dengan baik di blok BEGIN CATCH dengan atau tanpa titik koma.

Mungkin ada beberapa logika untuk ini tetapi rasanya sewenang-wenang dan Alice-in-Wonderland-ish.

Matthew Davidian
sumber
Salah satu kemungkinan penyebabnya adalah COMMIT TRANSACTIONmenerima transaksi opsional / menyimpan nama poin (yang akan diabaikan). Tanpa titik koma yang diakhiri, COMMIT TRANSACTIONdapat memakan simbol berikutnya jika diuraikan sebagai pengidentifikasi, yang secara radikal dapat mengubah semantik kode. Jika ini kemudian menghasilkan kesalahan, CATCHpemicu dapat terjadi tanpa COMMITpernah dieksekusi. Sebaliknya, sementara ROLLBACK TRANSACTIONjuga menerima pengenal opsional seperti ini, kesalahan dalam parsing kemungkinan besar akan mengakibatkan transaksi dibatalkan.
Jeroen Mostert
3

Tampaknya titik koma tidak harus digunakan dalam hubungannya dengan operasi kursor: OPEN, FETCH, CLOSEdan DEALLOCATE. Saya hanya menghabiskan beberapa jam dengan ini. Saya telah melihat dari dekat BOL dan memperhatikan bahwa [;] tidak ditampilkan dalam sintaks untuk pernyataan kursor ini !!

Jadi saya punya:

OPEN mycursor;

dan ini memberi saya kesalahan 16916.

Tapi:

OPEN mycursor

bekerja.

rab
sumber
2
Saya pikir ini tidak benar. BOL tidak terlalu konsisten dalam menyebutkan titik koma pada sintaks pernyataan, lihat SELECT misalnya. Plus, saya telah menyaksikan OPEN someCursor; bekerja dengan baik, sama untuk FETCH, CLOSE dan DEALLOCATE ...
Valentino Vranken
Itu menunjukkan kepada saya bug dengan parser. Apa versi SQL Server yang Anda gunakan?
Stewart
2

Menurut Konvensi Sintaks Transact-SQL (Transact-SQL) (MSDN)

Terminator pernyataan SQL Transact. Meskipun titik koma tidak diperlukan untuk sebagian besar pernyataan dalam versi SQL Server ini, itu akan diperlukan di versi masa depan.

(lihat juga komentar @gerryLowry)

Alan B
sumber
0

Saat menggunakan pernyataan DISABLE atau ENABLE TRIGGER dalam kumpulan yang memiliki pernyataan lain di dalamnya, pernyataan sebelum itu harus diakhiri dengan tanda titik koma. Jika tidak, Anda akan mendapatkan kesalahan sintaksis. Saya merobek rambut saya dengan yang ini ... Dan setelah itu, saya menemukan item MS Connect ini tentang hal yang sama. Ditutup karena tidak akan diperbaiki.

lihat di sini

Nick V
sumber
0

Catatan: Ini menjawab pertanyaan seperti yang tertulis, tetapi bukan masalah seperti yang dinyatakan. Menambahkannya di sini, karena orang akan mencarinya

Titik koma juga digunakan sebelumnya WITHdalam pernyataan CTE rekursif:

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM Numbers
    WHERE n+1 <= 10
)
SELECT n
FROM Numbers

Kueri ini akan menghasilkan CTE yang disebut Bilangan yang terdiri dari bilangan bulat [1..10]. Itu dilakukan dengan membuat tabel dengan nilai 1 saja, dan kemudian berulang sampai Anda mencapai 10.

v010dya
sumber
8
Secara teknis bukan 'sebelum dengan', tetapi setelah apa pun yang datang sebelumnya dengan. Jika with adalah pernyataan pertama dalam batch, tidak ada titik koma yang diperlukan.
Tor Haugen
Itu tidak juga digunakan sebelum DENGAN. Ini hanya titik koma yang mengakhiri pernyataan sebelumnya. Tampaknya beberapa orang telah memutuskan bahwa titik koma harus ada di sini karena ini adalah skenario di mana kata titik koma diperlukan. Mengapa orang-orang ini memutuskan ini lebih unggul daripada selalu mengakhiri pernyataan dengan titik koma, saya tidak tahu.
Stewart
0

Jika Anda suka mendapatkan kesalahan Command Timeout acak dalam SQLServer kemudian tinggalkan tanda titik koma di akhir string CommandText Anda.

Saya tidak tahu apakah ini didokumentasikan di mana saja atau apakah itu bug, tetapi itu memang terjadi dan saya telah belajar ini dari pengalaman pahit.

Saya memiliki contoh yang dapat diverifikasi dan direproduksi menggunakan SQLServer 2008.

alias -> Dalam praktiknya, selalu sertakan terminator meskipun Anda hanya mengirim satu pernyataan ke database.

Allan Maher
sumber
Jika Anda mendapatkan batas waktu untuk kueri berdasarkan apa pun selain apakah ada atau tidak titik koma di akhir, maka itu hampir pasti disebabkan oleh rencana eksekusi yang berbeda, karena itu di-cache dengan mencocokkan pada teks kueri yang tepat , termasuk yang secara semantik tidak relevan hal-hal seperti spasi putih, komentar, dan titik koma yang diakhiri. Titik koma itu sendiri akan sepenuhnya tidak bersalah menyebabkan masalah waktu.
Jeroen Mostert
-2

Titik koma tidak selalu bekerja dalam pernyataan SELECT majemuk.

Bandingkan dua versi pernyataan SELECT gabungan sepele yang berbeda ini.

Kode

DECLARE @Test varchar(35); 
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.';););); 
SELECT @Test Test;

kembali

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ';'.

Namun kodenya

DECLARE @Test varchar(35)
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.'))) 
SELECT @Test Test

kembali

Test
-----------------------------------
Semicolons do not always work fine.

(1 row(s) affected)
John Feild
sumber
11
[Setahun kemudian]: Wow saya terkejut bahwa belum ada yang mengomentari jawaban ini! Tentu saja itu tidak akan berfungsi, titik koma adalah pemisah pernyataan, jadi kode Anda dengan titik koma adalah: 1- SELECT @ Test = (SELECT (SELECT (SELECT 'SELECT' Semicolons tidak selalu berfungsi dengan baik. '; - ini bukan yang benar pernyataan 2-); - baik ini 3-); - baik itu yang 4-); - Entah itu yang titik koma harus setelah kurung 3
PhpLou
1
Anda hanya menggunakan titik koma untuk mengakhiri pernyataan . Subquery bukan pernyataan. Pernyataan adalah hal-hal yang dieksekusi secara berurutan. Dalam contoh Anda, ada tiga pernyataan: 1. DECLARE @ Test varchar (35) 2. SELECT @ Test = (SELECT (SELECT (SELECT 'Semicolons tidak selalu berfungsi dengan baik.'))) 3. SELECT @ Test Test
Stewart