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?
sql-server
tsql
Anwar Pinto
sumber
sumber
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.
sumber
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 dimintaSecara 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.
sumber
Dalam SQL2008 BOL, mereka mengatakan bahwa dalam rilis berikutnya, titik koma akan diperlukan. Karena itu, selalu gunakan itu.
Referensi:
sumber
Anda harus menggunakannya.
Dan yang paling penting:
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 ):sumber
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/
sumber
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.
Keluaran:
sumber
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
di luar blok BEGIN TRY / END TRY bekerja dengan baik untuk melakukan transaksi, tetapi di dalam blok itu harus
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.
sumber
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 tanpaCOMMIT
pernah dieksekusi. Sebaliknya, sementaraROLLBACK 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
danDEALLOCATE
. 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:
dan ini memberi saya kesalahan 16916.
Tapi:
bekerja.
sumber
Menurut Konvensi Sintaks Transact-SQL (Transact-SQL) (MSDN)
(lihat juga komentar @gerryLowry)
sumber
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
sumber
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: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.
sumber
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.
sumber
Titik koma tidak selalu bekerja dalam pernyataan SELECT majemuk.
Bandingkan dua versi pernyataan SELECT gabungan sepele yang berbeda ini.
Kode
kembali
Namun kodenya
kembali
sumber