常用表表达式,为什么用分号?

jra*_*ara 53 sql t-sql sql-server common-table-expression sql-server-2008

通常在SQL ServerCommon 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
Run Code Online (Sandbox Code Playgroud)

为什么?

gbn*_*gbn 75

  • 避免歧义,因为WITH可以在别处使用
    ..FROM..WITH (NOLOCK)..
    RESTORE..WITH MOVE..
  • ;在SQL Server中终止语句是可选的

放在一起,之前的声明必须在WITH/CTE之前终止.为了避免错误,大多数人都使用,;WITH因为我们不知道CTE之前是什么

所以

DECLARE @foo int;

WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
...;
Run Code Online (Sandbox Code Playgroud)

是相同的

DECLARE @foo int

;WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
...;
Run Code Online (Sandbox Code Playgroud)

MERGE命令具有类似的要求.

  • 对于较新的版本 - "SQL Server文档指示不使用分号终止T-SQL语句是不推荐使用的功能.这意味着长期目标是在未来版本的产品中强制使用分号. - Itzik Ben-Gan的Miscrosoft SQL Server 2012 T-SQL基础知识. (10认同)