Bir CTE neden noktalı virgül ile başlamalıdır?


14

Sadece StackOverflow'daki bir mesaja bakıyordum, Aaron Bertrand'ın sayılar tablosu yerine CTE kullanmayı önerdiği, eldeki görevi yerine getirmenin zarif bir yolu. Benim sorum, CTE'nin ilk satırı neden noktalı virgülle başlıyor?

;WITH n AS (SELECT TOP (10000) n FROM 
  (SELECT n = ROW_NUMBER() OVER
    (ORDER BY s1.[object_id])
    FROM sys.all_objects AS s1
    CROSS JOIN sys.all_objects AS s2
  ) AS x ORDER BY n
)
SELECT n FROM n ORDER BY n; -- look ma, no gaps!

WITH ifadesi bir öncekine SELECTveya başka bir şeye ayrıştırılmamasını sağlamak mı? I ile önce noktalı virgül kullanma hakkında SQL Server 2005 BOL hiçbir şey görmüyorum.


Yanıtlar:


26

Her zaman buraya veya StackOverflow'a gönderirken yaparım çünkü WITH- anahtar kelime aşırı yüklendiğinden - önceki komut sonlandırma noktalı virgül gerektirir. CTE kullanan bir kod örneği yapıştırırsam, kaçınılmaz olarak bazı kullanıcılar bunu mevcut kodlarına yapıştıracak ve önceki deyimde noktalı virgül bulunmayacaktır. Yani kod kırılıyor ve ben gibi şikayetler alıyorum:

Kodunuz bozuldu! Bu hata mesajını aldım:

Incorrect syntax near 'WITH'...

İnsanların ifadelerini her zaman noktalı virgülle sonlandırma konusunda daha iyi hale geldiğine inanmak istesem de, gürültüyü önceden boşaltmayı ve her zaman dahil etmeyi tercih ederim. Bazı insanlar bundan hoşlanmaz, ama <shrug />. Geçerli bir ifadeden önce veya sonra istediğiniz kadar noktalı virgül ekleyebilirsiniz. Bu geçerlidir:

;;;;SELECT 1;;;;;;;;;;;;SELECT 2;;;;;;;;SELECT 3;;;;;

Dolayısıyla, tanım gereği bunu gerektiren bir ifadeden önce ekstra bir noktalı virgül bulunmasının bir zararı yoktur. Çok güzel olmasa bile bunu yapmak daha güvenlidir.

Bu noktayı ele almak garip bir şekilde ifade edilmelidir, ancak "geçerli bir ifadeyi noktalı virgülle bitirmemek" aslında SQL Server 2008'den bu yana kullanımdan kaldırılmıştır. bir hatayı atlamak gerekli değildir, geçerli olan yerlerde kullanılmalıdır. Bunu burada görebilirsiniz:

http://msdn.microsoft.com/en-us/library/ms143729.aspx

(Son sayfada "noktalı virgül" ara)

İstisnalar olmasaydı tabii SQL Server olmazdı. Bunu dene:

BEGIN TRY;
  SELECT 1/1;
END TRY;
BEGIN CATCH;
  SELECT 1/1;
END CATCH;

Kuralın tek istisnası değil, ama en bilinçsiz bulduğum kural bu.


1
2012'de bile aynı hata mesajını alıyorum, ancak sadece noktalı virgül nedeniyle END TRY: i.stack.imgur.com/rc6dw.png - bu noktalı virgül kaldırılırsa her şey işe yarar .
Aaron Bertrand

Sanırım daha önce noktalı virgül koyamazsınız BEGIN CATCHçünkü tek bir bileşik ifadenin bir parçasıdır BEGIN TRY. Bir IFifadenin önüne noktalı virgül koymakla aynıdır ELSE.
Andriy M

@AndriyM Buradaki kurallar hakkında çok daha ayrıntılı bir görüşme yapmaktan mahrum kaldım. Bundan bahsettim, çünkü onun karşısına çıkan herkes için bir sürpriz, sebebini anlamadığım için değil. :-)
Aaron Bertrand

10

Bu, WITHT-SQL'de çeşitli amaçlara hizmet edebileceğinden, önceki ifadelere dahil edilmemesini sağlamak içindir .

Partideki ilk ifade buysa, ihtiyacın olduğunu düşünmüyorum.

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.