web-dev-qa-db-ja.com

共通テーブル式、なぜセミコロン?

通常は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

どうして?

55
jrara
  • WITHは他の場所で使用できるため、あいまいさを回避するため
    ..FROM..WITH (NOLOCK)..
    RESTORE..WITH MOVE..
  • SQLServerでステートメントを;で終了することはオプションです

まとめると、前のステートメントはWITH/CTEの前に終了する必要があります。エラーを回避するために、CTEの前に何があるかわからないため、ほとんどの人は;WITHを使用します

そう

DECLARE @foo int;

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

と同じです

DECLARE @foo int

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

MERGEコマンドにも同様の要件があります。

74
gbn