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?
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?
Jawaban:
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.
THROW
pernyataan Broker Layanan? Kita perlu memasukkan titik koma sebelum dilemparkan ke dalam contoh ini:BEGIN ;THROW @Error, 'Invalid FundingID', 2; RETURN END
MERGE
juga misalnya). Sebagaimana disebutkan dalam jawaban lain, dalam standar ANSI mereka diminta
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.
Dalam SQL2008 BOL, mereka mengatakan bahwa dalam rilis berikutnya, titik koma akan diperlukan. Karena itu, selalu gunakan itu.
Referensi:
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
BEGIN TRY
BEGIN TRAN
SELECT 1/0 AS CauseAnException;
COMMIT
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE();
THROW
END CATCH
not using them
teknik 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 :-)
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.
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/
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
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.
COMMIT TRANSACTION
menerima transaksi opsional / menyimpan nama poin (yang akan diabaikan). Tanpa titik koma yang diakhiri, COMMIT TRANSACTION
dapat memakan simbol berikutnya jika diuraikan sebagai pengidentifikasi, yang secara radikal dapat mengubah semantik kode. Jika ini kemudian menghasilkan kesalahan, CATCH
pemicu dapat terjadi tanpa COMMIT
pernah dieksekusi. Sebaliknya, sementara ROLLBACK TRANSACTION
juga menerima pengenal opsional seperti ini, kesalahan dalam parsing kemungkinan besar akan mengakibatkan transaksi dibatalkan.
Tampaknya titik koma tidak harus digunakan dalam hubungannya dengan operasi kursor: OPEN
, FETCH
, CLOSE
dan 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.
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)
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
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 WITH
dalam 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.
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.
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)