Ich habe mir gerade einen Beitrag zu StackOverflow angesehen, in dem Aaron Bertrand vorschlägt, einen CTE anstelle einer Nummerntabelle zu verwenden, was eine elegante Möglichkeit darstellt, die anstehende Aufgabe auszuführen. Meine Frage ist, warum die erste Zeile des WAK mit einem Semikolon beginnt.
;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!
Soll dies sicherstellen, dass die WITH-Anweisung nicht in eine frühere SELECT
oder eine andere Anweisung zerlegt wird ? Ich sehe in SQL Server 2005 BOL nichts über die Verwendung eines Semikolons vor dem WITH.
sql-server
t-sql
cte
syntax
Max Vernon
quelle
quelle
Antworten:
Ich mache das immer, wenn ich hier oder auf StackOverflow poste, weil
WITH
der vorherige Befehl - da das Schlüsselwort überladen ist - ein abschließendes Semikolon erfordert. Wenn ich ein Codebeispiel einfüge, das einen CTE verwendet, wird dieser zwangsläufig von einigen Benutzern in den vorhandenen Code eingefügt, und die vorherige Anweisung enthält kein Semikolon. Der Code bricht also und ich bekomme Beschwerden wie:Während ich glauben möchte, dass die Leute besser werden , wenn sie ihre Aussagen immer mit einem Semikolon abschließen , würde ich das Rauschen lieber vorwegnehmen und es einfach immer mit einbeziehen. Manche Leute mögen es nicht, aber
<shrug />
. Sie können beliebig viele Semikolons vor oder nach einer gültigen Anweisung einfügen. Das ist gültig:Es schadet also nichts, wenn ein zusätzliches Semikolon vor einer Anweisung steht, die dies per Definition erfordert. Das ist sicherer, auch wenn es nicht so hübsch ist.
Es muss seltsam formuliert werden, um den Punkt zu verdeutlichen, aber "eine gültige Anweisung nicht mit einem Semikolon zu beenden" ist seit SQL Server 2008 veraltet. Wie ich im Blog-Post beschreibe, verweise ich auf den obigen Link, auch in Fällen, in denen Es ist nicht erforderlich, einen Fehler zu umgehen. Es sollte verwendet werden, wo immer dies gültig ist. Sie können dies hier sehen:
http://msdn.microsoft.com/en-us/library/ms143729.aspx
(Suche auf der letzten Seite nach "Semikolon")
Natürlich wäre es nicht SQL Server, wenn es keine Ausnahmen gäbe. Versuche dies:
Es ist nicht die einzige Ausnahme von der Regel, aber die, die ich am wenigsten intuitiv finde.
quelle
END TRY
: i.stack.imgur.com/rc6dw.png - wenn ich dieses Semikolon entferne, funktioniert alles.BEGIN CATCH
einfach vorher setzen , weil es Teil einer einzelnen zusammengesetzten Anweisung ist, die mit eingeführt wirdBEGIN TRY
. Es ist dasselbe wie ein Semikolon vor eineIF
Anweisung zu setzenELSE
.Dies soll sicherstellen, dass es nicht in vorherigen Anweisungen enthalten ist, da es
WITH
in T-SQL eine Vielzahl von Zwecken erfüllen kann.Wenn es die erste Aussage im Stapel ist, denke ich nicht, dass Sie es brauchen.
quelle