Soru SQL Server'da noktalı virgül kullanmalıyım?


Web'de bazı kodları ve SQL Server Management Studio tarafından oluşturulan komutları kontrol ederken bazı ifadelerin noktalı virgülle sonlandığını fark ettim.

Peki ne zaman kullanmalıyım?


175
2018-04-02 17:11


Menşei


SQL Server 2008 R2  msdn.microsoft.com/en-us/library/ms177563.aspx "Transact-SQL Sözdizimi Kuralları (Transact-SQL)" ; == Transact-SQL deyimi sonlandırıcı. Çoğu ifadede noktalı virgül olmasa da bu versiyon SQL Server'ın gelecek sürümde gerekli olacak. - gerryLowry


Cevaplar:


Bir SQLServerCentral.Com'dan makale Ken Powers tarafından:

Noktalı virgül

Noktalı virgül karakteri bir ifadeyi sonlandırır. ANSI SQL-92 standardının bir parçasıdır, ancak Transact-SQL içinde asla kullanılmamıştır. Gerçekten de, T-SQL'i bir noktalı virgülle karşılaşmadan yıllarca kodlamak mümkündü.

kullanım

Noktalı virgülü kullanmanız gereken iki durum vardır. İlk durum, Ortak Tablo İfadesi (CTE) kullandığınız yerdir ve CTE, toplu işteki ilk ifade değildir. İkincisi, bir Service Broker bildirimi yayınladığınız yerdir ve Service Broker ifadesi, toplu işteki ilk ifadedir.


124
2018-04-02 17:14



mı THROW Servis Broker açıklaması? Bu örnekteki bir atıştan önce bir yarım kolon eklememiz gerekiyor: BEGIN ;THROW @Error, 'Invalid FundingID', 2; RETURN END - Chris Walsh
Temel olarak, son yıllarda tanıtılan tüm yeni ifade türlerinden önce, genel olarak noktalı virgül kullanımını teşvik ediyor gibi görünüyor. (MERGE örneğin, örneğin). Diğer cevaplarda da belirtildiği gibi, ANSI standardında bunlar gereklidir - Mark Sowul
@maurocam Belgeyi yanlış okuduğunuzu düşünüyorum. Bu bağlantıya bakarsanız "diyorDeğil Transact-SQL deyimlerini noktalı virgülle sonlandırmak. " - Caltor
@caltor Dohhh, sadece okuma okuması için bana hizmet ediyor. Bunun garip bir şey olduğunu düşündüm. Beni düzelttiğin için teşekkürler - maurocam
@maurocam Bağlantı için teşekkürler, şimdi en azından noktalı virgüllerin kullanılmasının teşvik edildiğini biliyorum. - Wodzu


Varsayılan olarak, SQL deyimleri noktalı virgülle sonlandırılır. Yeni bir ifade terminatörü belirlemediğiniz sürece (nadiren) ifadeleri sonlandırmak için noktalı virgül kullanın.

Sadece bir ifade gönderiyorsanız, teknik olarak ifade terminatörüne başvurabilirsiniz; Bir komut dosyasında, birden fazla ifade gönderirken, buna ihtiyacınız var.

Pratikte, veritabanına yalnızca bir ifade gönderiyor olsanız bile her zaman terminatör dahil.

Düzenleme: deyimleriyle yanıt veren terminatörlere [belirli RDBMS] tarafından gerek duyulmaz, bu doğru olabilir, ANSI SQL Standard tarafından istenir. Tüm programlamalarda, eğer bir fonksiyonellik kaybı olmaksızın bir standarda bağlı kalabiliyorsak, o zaman kodumuz ya da alışkanlıklarımız tek bir satıcısına bağlı değildir.

Bazı C derleyicileriyle, Standardın int dönüşüne ana ihtiyaç duymasına rağmen, ana dönüş boşluğuna sahip olmak mümkündür. Fakat bunu yapmak bizim kodumuzu ve kendimizi daha az taşınabilir yapar.

Programlamada en büyük zorluk, yeni şeyler öğrenmemek, kötü alışkanlıklardan kurtulmaktır. İlk etapta kötü alışkanlıkları elde etmekten sakınmak için, bizim için, bizim kodumuzda ve kodumuzu okuyan veya kullanan herkes için bir kazançtır.


67
2018-04-02 17:15



Birden çok ifade gönderirken noktalı virgole ihtiyacınız olduğunu söylerken bu doğru değildir. - TheTXI


SQL2008 BOL'de bir sonraki sürümlerde noktalı virgüllerin gerekeceğini söylüyorlar. Bu nedenle, her zaman kullanın.

Referans:


23
2018-04-02 18:09





Bunu doğru bir şekilde okuduğumda, TSQL ifadelerini sonlandırmak için noktalı virgül kullanmak şarttır. http://msdn.microsoft.com/en-us/library/ms143729%28v=sql.120%29.aspx

DÜZENLE: Komut dosyanızı biçimlendirecek ve noktalı virgül ekleyecek SSMS 2008R2 için bir eklenti buldum. Yine de beta olduğunu düşünüyorum ...

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

DÜZENLE: ApexSQL denilen daha iyi bir ücretsiz araç / eklenti buldum ... http://www.apexsql.com/


22
2017-08-13 14:01



tsqltidy.com artık var gibi görünmüyor. - Aluan Haddad


Sen şartkullan.

İfadeleri sonlandırmak için noktalı virgül kullanma standardıdır ve aslında bir gerekliliktir       diğer birçok veritabanı platformunda. SQL Server yalnızca noktalı virgül gerektirir       vakalar — ancak bir noktalı virgülün gerekmediği durumlarda, birinin kullanılması sorun yaratmaz.       Tüm ifadeleri noktalı virgülle sonlandırma uygulamasını uygulamanızı kesinlikle öneririz.       Bunu yapmak sadece kodunuzun okunabilirliğini arttırmakla kalmaz, aynı zamanda bazı durumlarda       Seni biraz keder kurtarabilirim. (Noktalı virgül gerekli ve belirtilmemişse, hata iletisi SQL       Sunucu üreten her zaman çok açık değildir.)

Ve en önemlisi:

SQL Server belgeleri, T-SQL deyimlerini       noktalı virgül, kullanımdan kaldırılmış bir özelliktir. Bu, uzun vadeli hedefin kullanımı zorlamak olduğu anlamına gelir       Ürünün gelecekteki bir sürümünde noktalı virgülün. Bu içine girmek için bir sebep daha var       Şu anda gerekli olmadığı durumlarda bile tüm ifadelerinizi sonlandırma alışkanlığı.

Kaynak: Microsoft SQL Server 2012 T-SQL Temelleri  Itzik Ben-Gan tarafından.


Her zaman neden kullanmanız gerektiğine dair bir örnek ; Aşağıdaki iki sorgu (bunlar kopyalandı) posta):

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

enter image description here

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

enter image description here


12
2017-10-14 08:35



Bu güçlü bir argüman gibi görünüyor meli noktalı virgül kullanın (tırnaklarla yedeklenir), ancak sadece bir şart. - Gregor
@Gregor, eğer noktalı virgül kullanmanın bir zorunluluk olduğu ve not using them Kullanımdan kaldırılmış tekniği kullanmalısınız. Aksi takdirde, gelecekte acı çekmek için bir risk vardır. Eğer işinizi yükseltmeyi / değiştirmeyi planlamıyorsanız ve her zaman SQL Server 2000 ile çalışacaksanız, emin olun :-) - gotqn
Sağ, meli, Katılıyorum. Ama ilk satırın cevabını vurguladı şartDurum böyle değil, en azından henüz değil. - Gregor
Noktalı virgülle sonuçlanır. Incorrect syntax near 'THROW'.SQL Server 2008'de (10.0.6241.0), işte uğraşmam gereken bir versiyon. 2012'de göründüğü gibi çalışıyor. Kullanımdan kaldırılma nedeniyle noktalı virgül kullanmaya başladım. Çoğu zaman 2008'de bir sorun olacağını düşünmüyorum. - Pilot_51


Kişisel görüş: Onları sadece gerektiğinde kullanın. (Gerekli liste için yukarıdaki TXI'nin cevabına bakın.)

Derleyici bunları gerektirmediğinden kutu hepsini yere koy, ama neden? Derleyici size nerede unuttuğunuzu söylemez, bu yüzden tutarsız kullanımla sonuçlanırsınız.

[Bu görüş SQL Server'a özgüdür. Diğer veritabanları daha sıkı gereksinimlere sahip olabilir. Birden çok veritabanında çalışmak için SQL yazıyorsanız, gereksinimleriniz değişebilir.

tpdi, "bir senaryoda, birden fazla ifade gönderirken, buna ihtiyacınız var." Bu aslında doğru değil. Onlara ihtiyacın yok.

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

Çıktı:

Semicolons are optional
Semicolons are optional
Semicolons are optional
Semicolons are optional

9
2018-04-02 17:27



Bu tartışma hakkında ne düşünüyorsun? sqlservercentral.com/Forums/Topic636549-8-1.aspx (Yoy bugmenot@bugmenot.com'u kullanabilir: bir hesabınız yoksa bugmenot) - Anwar Pinto
Açıkça belirtmiş olduğun için teşekkür ederim, bu sadece sizin fikrinizdir, ancak bunun hem Microsoft belgelerine hem de ANSI standardına uygun olduğu için iyi bir cevap vereceğini düşünmüyorum. Bir yorumda bu düşüncenin daha iyi olacağını düşünürdüm. (Seni vurmaya çalışmayın, yarı-kolon kullanımıyla ilgili düşüncelerinize haklısınız!) - izzy


T-SQL hakkında öğrenmem gereken çok şey var, ama bir işlem için bazı kodları çalıştırırken (ve stackoverflow ve diğer sitelerden örnekler üzerinde kod), bir noktalı virgülün gerekli olduğu ve eksikse, İfadenin hiç yapılmadığı görülüyor ve hiçbir hata ortaya çıkmıyor. Bu, yukarıdaki cevapların hiçbirinde ele alınmamış gibi görünmektedir. (Bu MS SQL Server 2012 kullanıyordu.)

İşlemi istediğim şekilde yürüttüğümde, bir hata yakalamaya karar verdim, böylece herhangi bir hata varsa geri alınır. Sadece bunu yaptıktan sonra, işlem yapılmadı (SSMS bunu, pencereyi kapatmaya çalışırken hoş olmayan bir mesajla sizi uyarıyor.

Yani bu

COMMIT TRANSACTION 

BEGIN TRY / END YTL bloğu dışında işlem yapmak için gayet iyi çalıştı, ancak bloğun içinde olması gerekiyordu.

COMMIT TRANSACTION;

Hiçbir hata veya uyarı verilmediğini ve sorgu sekmesini kapatmaya çalışana kadar işlemin hala yapılmadığına dair bir işaret bulunmadığını unutmayın.

Neyse ki, bu çok büyük bir soruna neden olur ki, bir problem olduğu hemen belli olur. Ne yazık ki hata (sözdizimi ya da başka bir şekilde) bildirilmediğinden, sorunun ne olduğu hemen belli değildi.

Aksine, ROLLBACK TRANSACTION, bir noktalı virgus olan veya olmayan BEGIN CATCH bloğunda eşit derecede iyi çalışır gibi görünmektedir.

Bunun bir mantığı olabilir ama keyfi ve Alice-in-Wonderland-ish hissediyor.


2
2018-06-11 19:57





Göre Transact-SQL Sözdizimi Kuralları (Transact-SQL) (MSDN)

Transact-SQL deyimi sonlandırıcı. SQL Server'ın bu sürümünde çoğu deyim için noktalı virgül gerekmiyor olsa da, gelecekteki bir sürümde gerekli olacaktır.

(ayrıca @gerryLowry adlı kullanıcının yorumu)


2
2017-08-26 08:12





Noktalı virgüllerin imleç işlemleri ile bağlantılı olarak kullanılmaması gerektiği görülür: AÇIK, FETCH, CLOSE ve DEALLOCATE. Bununla sadece birkaç saatimi harcadım. BOL'a yakından baktım ve [;] bu imleç ifadelerinin sözdiziminde gösterilmediğini fark ettim!

Yani ben vardı: OPEN mycursor; ve bu bana 16916 hatası verdi.

Fakat: OPEN mycursor çalıştı.


1
2017-09-23 06:37



Bunun doğru olduğunu düşünmüyorum. BOL deyim sözdiziminde noktalı virgülden bahsetmekte çok tutarlı değildir, örneğin SELECT'e bakın. Üstelik bazı imleç OPEN'e şahit oldum; FETCH, CLOSE ve DEALLOCATE için aynı şekilde çalışıyor ... - Valentino Vranken


Noktalı virgüller her zaman bileşik SELECT ifadelerinde çalışmazlar.

Önemsiz bir bileşik SELECT ifadesinin bu iki farklı sürümünü karşılaştırın.

Kod

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

döner

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

Ancak, kod

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

döner

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

(1 row(s) affected)

1
2017-10-03 06:26



[Bir yıl sonra]: Vay vay anladım henüz kimse bu cevabı yorumlamadı! Tabii ki işe yaramaz, noktalı virgüller deyim ayırıcılarıdır, bu yüzden noktalı virgülle kodunuz şöyledir: 1- SELECT @ Test = (SELECT (SELECT (SELECT) 'SELECT' 'noktalı virgüller her zaman iyi çalışmaz.'; - bu doğru değil ifade 2-) —Bu da 3'tür -) - ya 4); - ya bir noktalı virgül 3 parantez sonra olmalıdır - PhpLou