Właśnie patrzyłem na post na StackOverflow, w którym Aaron Bertrand proponuje użycie CTE zamiast tabeli liczb, co jest eleganckim sposobem wykonania danego zadania. Moje pytanie brzmi: dlaczego pierwsza linia CTE zaczyna się średnikiem?
;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!
Czy ma to na celu zapewnienie, że instrukcja WITH nie zostanie przeanalizowana w poprzednim SELECT
lub czymś innym ? W BOL programu SQL Server 2005 nie widzę nic o używaniu średnika przed Z.
sql-server
t-sql
cte
syntax
Max Vernon
źródło
źródło
Odpowiedzi:
Zawsze robię to, pisząc tutaj lub na StackOverflow, ponieważ
WITH
- ponieważ słowo kluczowe jest przeciążone - poprzednie polecenie wymaga kończącego średnika. Jeśli wkleję przykładowy kod, który używa CTE, nieuchronnie jakiś użytkownik wklei go do swojego istniejącego kodu, a poprzednie oświadczenie nie będzie zawierało średnika. Więc kod się psuje i dostaję takie skargi, jak:Chociaż chciałbym wierzyć, że ludzie stają się coraz lepsi w tym, że zawsze kończą swoje wypowiedzi średnikiem , wolałbym uprzedzić hałas i po prostu zawsze go uwzględniać. Niektórym się to nie podoba, ale
<shrug />
. Możesz dołączyć tyle średników przed lub po prawidłowym wyciągu, ile chcesz. Jest to ważne:Zatem nie ma żadnej szkody, że istnienie dodatkowego średnika przed stwierdzeniem, że z definicji tego wymaga. Jest to bezpieczniejsze, nawet jeśli nie jest tak ładne.
To musi być dziwnie sformułowane, aby uzyskać sens, ale „nie kończenie prawidłowego wyrażenia średnikiem” jest w rzeczywistości przestarzałe od SQL Server 2008. Tak więc, jak opisuję w blogu, odsyłam do powyższego, nawet w przypadkach, w których nie jest wymagane obejście błędu, powinno być stosowane wszędzie tam, gdzie jest ważne. Możesz to zobaczyć tutaj:
http://msdn.microsoft.com/en-us/library/ms143729.aspx
(Wyszukaj na ostatniej stronie „średnik”)
Oczywiście nie byłby to SQL Server, gdyby nie było wyjątków. Spróbuj tego:
Nie jest to jedyny wyjątek od reguły, ale najbardziej nieintuicyjny.
źródło
END TRY
: i.stack.imgur.com/rc6dw.png - jeśli usunę ten średnik, wszystko będzie działać .BEGIN CATCH
ponieważ jest on częścią pojedynczej instrukcji złożonej wprowadzonej za pomocąBEGIN TRY
. To tak samo, jak wstawienie średnika przedIF
wyrażeniemELSE
.Ma to na celu zapewnienie, że nie zostanie uwzględnione w żadnych poprzednich instrukcjach, ponieważ
WITH
może służyć do różnych celów w języku T-SQL.Jeśli to pierwsze stwierdzenie w partii, nie sądzę, żebyś go potrzebował.
źródło