SQL Server'da ne zaman GO kullanmalısınız ve ne zaman noktalı virgül kullanmalısınız;?


100

GO anahtar sözcüğünü komutlardan sonra ne zaman kullanmam gerektiği ve komutların sonunda noktalı virgül gerekip gerekmediği konusunda her zaman kafam karıştı. Farklar nelerdir ve bunları neden / ne zaman kullanmalıyım?

SQL Server Management Studio'da Generate komut dosyasını çalıştırdığımda, GO her yerde kullanıyor gibi görünüyor, ancak noktalı virgül kullanmıyor.


Yanıtlar:


93

GOyalnızca SSMS ile ilgilidir - gerçek Transact SQL değildir, sadece SSMS'ye SQL ifadelerini her bir GOgrup arasında sırayla göndermesini söyler .

Bu ;bir SQL deyim sınırlayıcıdır, ancak motor çoğunlukla ifadelerinizin nerede bozulduğunu yorumlayabilir.

Ana istisna ve ;en sık kullanıldığı yer Ortak Tablo İfadesi İfadesinin öncesidir.


5
Vurgu GOise T-SQL Bölüm değildir ;olduğunu
msarchet

2
Bir MERGEifade noktalı virgülle sonlandırılmalıdır.
07

15
Güncelleme: SQL Server 2012'de noktalı virgül KULLANMAMASI önerilmemektedir, bu da sonraki sürümde gerekli olacağı anlamına gelir. Bu nedenle, geçiş durumunda daha az çalışma gerektireceğinden (ve bir standart olduğu için) noktalı virgül kullanmak iyi bir uygulamadır. Kaynak: technet.microsoft.com/en-us/library/ms143729.aspx veya SQL Server 2012'deki kitap: shop.oreilly.com/product/0790145321978.do
Paweł Bulwan

1
SQL 2014, bir sonraki sürüm için gerektiği gibi hala noktalı virgül listeliyor. Ne zaman kullanımdan kaldırılacağını merak ediyorum. technet.microsoft.com/en-us/library/ms143729.aspx
Frank

2
+ buli, ;kullanımdan kaldırıldığını belirtmiyor , KULLANILMADI, kullanımdan kaldırıldı, yani kaynağa göre zorunlu hale gelecek.
cjk

78

Generated DDL betiklerinde bu kadar çok GO görmenizin nedeni, toplu işlerle ilgili aşağıdaki kuraldır .

CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER ve CREATE VIEW deyimleri, toplu işteki diğer ifadelerle birleştirilemez. CREATE deyimi toplu işe başlamalıdır. Bu toplu işte takip eden diğer tüm ifadeler, ilk CREATE ifadesinin tanımının bir parçası olarak yorumlanacaktır.

Generated DDL'nin kullanım durumlarından biri, tek bir dosyada birden çok nesne oluşturmaktır. Bu nedenle, bir DDL üreteci parti üretebilmelidir. Başkalarının söylediği gibi, GO ifadesi toplu işi bitirir.


10
Bu gerçekten "... GO ne zaman kullanmalısınız ...?" Sorusuna cevap veren tek kişidir. sorunun bir parçası.
Roimer

Bana öyle geliyor ki GO; aşağıdakileri içerebilecek SQL içeren nesneler oluşturan ifadeleri sonlandırıyor; ifade sonlandırıcı. Başka bir DBMS'de, sonlandırma dizesini ayarlama yeteneğini gördüm. Örneğin, ifadelerin iki boru karakteriyle || bittiğini belirtebilirsiniz. Daha sonra CREATE PROCEDURE ... ile biten birçok SQL; ... || ve çift boru CREATE PROCEDURE deyimini sona erdirir. Öyleyse sorum, bunun MS GO beyanına benzer olup olmadığı? İkinci olarak, SQLSERVER'da sonlandırma dizesini yeniden tanımlayabilir misiniz?
youcantryreachingme

@youcantryreachingme Bunun 2010'da doğru olup olmadığını bilmiyorum ama öyle görünüyor ki yapabilirsin. Bkz. SSMS: Toplu Ayırıcı . Bunun sınırlarının ne olduğundan emin değilim
Conrad Frix

34

GİT

Go, bir toplu ayırıcıdır. Bu, o partideki her şeyin o belirli parti için yerel olduğu anlamına gelir.

Değişkenlerin, Tablo Değişkenlerinin vb. Herhangi bir bildirimi, GOifadeler arasında geçmez .

# Tempo tabloları bir bağlantı için yereldir, bu nedenle GO ifadelerine yayılırlar.

Noktalı virgül

Noktalı virgül bir ifade sonlandırıcıdır. Bu, yalnızca belirli bir ifadenin sona erdiğini belirtmek için kullanılır.

Çoğu durumda, ifade sözdiziminin kendisi bir ifadenin sonunu belirlemek için yeterlidir.

Bununla birlikte, CTE'ler, WITH'nin ilk ifade olmasını talep eder, bu nedenle WITH'den önce bir noktalı virgül gerekir.


4
Bir MERGEifade noktalı virgülle sonlandırılmalıdır.
07

11

Her SQL ifadesini sonlandırmak için noktalı virgül kullanmalısınız. Bu, SQL Standartlarında tanımlanmıştır,

Elbette, çoğu zaman SQL Server, ifade sonlandırıcısını atlamanıza izin verir, ancak neden kötü alışkanlıklara girersiniz?

Diğerlerinin de belirttiği gibi, ortak bir tablo ifadesinden (CTE) önce gelen ifade noktalı virgülle sonlandırılmalıdır. Sonuç olarak, noktalı virgül sonlandırıcıyı tam olarak benimsemeyen halktan şunu görüyoruz:

;WITH ...

bence gerçekten tuhaf görünüyor. Çevrimiçi bir forumda kodun kalitesini yapıştırılacağını söyleyemediğinizde bunun mantıklı olduğunu düşünüyorum.

Ek olarak, bir MERGEifade noktalı virgülle sonlandırılmalıdır. Burada bir model görüyor musunuz? Bunlar, SQL Standartlarını yakından takip eden TSQL'e yapılan yeni eklemelerden birkaçıdır. Görünüşe göre SQL Server ekibi noktalı virgül sonlandırıcının kullanımını zorunlu kılma yolunda ilerliyor.


2
" Bence gerçekten tuhaf görünüyor " - daha fazla katılamıyorum. Ve gibi garip soruların bu potansiyel müşteri sürekli tekrarı bu ya bu
a_horse_with_no_name

SQL Server özensiz olmanıza izin vermez - fazlalık bir ifade sonlandırıcısını atlamanıza izin verir; T-SQL, diğer çoğu SQL gibi, saf standart SQL değildir, bu daha çok soyut bir temel sınıf gibidir - pratikte DB motorunun kendi lehçesi lehine kullanılmaz.
ProfK

@ProfK: Yorumunuza noktalama işaretleri eklediğiniz, özellikle de cümle sonlandırıcı karakterleri okuyup anlamamı kolaylaştırdığınız için teşekkür ederim.
Kısa

8

GO bir toplu sonlandırıcıdır, noktalı virgül bir ifade sonlandırıcıdır.

1 komut dosyasında birden çok proc deyimi oluşturmak istediğinizde GO kullanacaksınız çünkü create proc bir toplu işteki ilk ifade olmalıdır. Ortak tablo ifadeleri kullanırsanız, önündeki ifadenin noktalı virgülle sonlandırılması gerekir.


Bir MERGEifade noktalı virgülle sonlandırılmalıdır.
07
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.