SQL Server 2005执行含WITH语句报错,2014正常求助
解决SQL Server 2005中WITH子句的语法错误问题
这个问题我碰到过好几次啦,本质是SQL Server 2005对CTE(公用表表达式)的语法要求比2014更严格,尤其是WITH关键字的前置规则。
核心原因
SQL Server 2005有个硬性规定:如果WITH子句不是整个SQL批处理中的第一个语句,必须在它前面加一个分号(;)来终止前面的所有语句。而SQL Server 2014及后续版本放宽了这个限制,所以高版本能正常运行的查询,到2005就会触发语法错误。
解决方案
1. 给WITH前的语句补充分号
比如你的查询如果是类似这样的简化示例:
-- 前面有其他查询语句 SELECT * FROM dbo.OldTable -- CTE定义 WITH MyCTE AS ( SELECT ID, Name FROM dbo.NewTable ) SELECT * FROM MyCTE
在2005中会报错,只需给前面的语句加上分号即可:
SELECT * FROM dbo.OldTable; -- 这里加分号终止前面的语句 WITH MyCTE AS ( SELECT ID, Name FROM dbo.NewTable ) SELECT * FROM MyCTE
2. 检查CTE本身的语法正确性
如果WITH已经是批处理的第一个语句,那可能是CTE定义有问题,需要核对以下几点:
- 必须遵循
WITH CTE名称 AS (...)的格式,不能遗漏AS关键字 - CTE括号内的SELECT语句不能包含
COMPUTE、COMPUTE BY或者FOR BROWSE这类2005不支持的语法 - CTE定义完成后,必须紧跟使用它的DML语句(SELECT/INSERT/UPDATE/DELETE等),不能空着
比如正确的单CTE写法:
WITH MyCTE AS ( SELECT ID, COUNT(*) AS RecordCount FROM dbo.LogTable GROUP BY ID ) SELECT * FROM MyCTE WHERE RecordCount > 5
3. 多CTE场景注意逗号分隔
如果查询里有多个CTE,2005要求用逗号分隔,不能重复写WITH:
-- 正确写法 WITH CTE1 AS ( SELECT ID FROM dbo.Table1 ), CTE2 AS ( -- 用逗号分隔,不要重复写WITH SELECT Name FROM dbo.Table2 WHERE ID IN (SELECT ID FROM CTE1) ) SELECT * FROM CTE2
内容的提问来源于stack exchange,提问作者user8002153
相关产品推荐
相关产品推荐

