Общее табличное выражение, почему точка с запятой? - PullRequest
51 голосов
/ 04 августа 2011

Обычно в SQL Server выражении Common Table Expression перед оператором ставится точка с запятой, например:

;WITH OrderedOrders AS --semicolon here
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60

Почему?

1 Ответ

73 голосов
/ 04 августа 2011
  • Чтобы избежать неоднозначности, поскольку WITH можно использовать в других местах
    ..FROM..WITH (NOLOCK)..
    RESTORE..WITH MOVE..
  • Не обязательно завершать операторы с ; в SQL Server

В совокупности предыдущий оператор должен быть завершен перед WITH / CTE.Чтобы избежать ошибок, большинство людей используют ;WITH, потому что мы не знаем, что находится до CTE

Так что

DECLARE @foo int;

WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
...;

совпадает с

DECLARE @foo int

;WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
...;

Команда MERGE имеет аналогичное требование.

...