公用表表达式,为啥要分号?

Posted

技术标签:

【中文标题】公用表表达式,为啥要分号?【英文标题】:Common Table Expression, why semicolon?公用表表达式,为什么要分号? 【发布时间】:2011-10-19 18:21:54 【问题描述】:

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

为什么?

【问题讨论】:

【参考方案1】: 为了避免歧义,因为 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 命令也有类似的要求。

【讨论】:

一个快速简洁的答案,非常好。我会花半天时间或半英里页面(有点夸张,但不过分)。说英语作为第二语言的“好处”... 对于较新的版本 - The SQL Server documentation indicates that not terminating T-SQL statements with a semicolon is a deprecated feature. This means that the long-term goal is to enforce use of the semicolon in a future version of the product. - Miscrosoft SQL Server 2012 T-SQL Fundamentals by Itzik Ben-Gan. Microsoft 已弃用缺少的分号十多年,并承诺在“未来版本”中需要它。良好的做法是始终使用终止分号,就像所有其他数据库一样。除此之外,在这种情况下,这将消除对古怪的前导分号的需要。 @Manngo 同意,但有时它只是防御性编程,尤其是在共享开发环境中

以上是关于公用表表达式,为啥要分号?的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver 创建视图失败,原因:ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效

T-SQL 公用表表达式(CTE)

公用表表达式:关系不存在

公用表表达式(CTE)

SQL Server 公用表表达式(CTE)实现递归

SQL Server 公用表表达式(CTE)实现递归