T-SQL中将CTE查询结果赋值给变量时出现WITH语法错误
问题根因
T-SQL 语法不支持将 CTE(公用表表达式)的定义直接写在SET @变量 =的等号后方。CTE 必须定义在它所属的单条查询语句的最开头位置,嵌套在赋值表达式内部会直接触发语法解析错误,这也是收到两条WITH关键字相关报错的核心原因。
单独运行查询逻辑能正常返回结果,是因为单独执行时CTE定义处于整条查询的最起始位置,完全符合语法规则。
修正后可正常运行的代码
DECLARE @ReportRecipients VARCHAR(MAX); -- CTE定义必须放在所属查询语句的最开头 WITH CTE_TableName AS ( SELECT a.emailText FROM CSLEventAUP_Edit a JOIN CSLEventAUP_EventEditJunction b ON a.Id = b.EditId JOIN CSLEventAUP_Events c ON b.EventId = c.Id WHERE c.LogicalDeleteIn = 0 AND c.StaffEvent = 1 AND a.emailText IS NOT NULL UNION SELECT emailText FROM CSLEventAUP_Edit WHERE CyberGroup = 1 ) -- 直接在CTE的查询逻辑中给变量赋值即可 SELECT TOP 1 @ReportRecipients = STUFF(( SELECT ';' + emailText FROM CTE_TableName t1 ORDER BY t1.emailText FOR XML PATH('') ), 1, LEN(';'), '') FROM CTE_TableName t0;
关键语法注意点
- CTE的作用域仅为紧随其定义的单条SQL语句,如果CTE前面存在其他未结尾的语句,需要在前一条语句末尾加分号终止,再写CTE定义。
- 不需要用SET包裹CTE查询来赋值,直接在CTE关联的SELECT子句中用
@变量 = 字段/计算结果的形式赋值即可,写法更简洁也符合语法规范。 - 原代码中存在
emailTExt、emailText的字段名大小写混用问题,虽然SQL Server默认大小写不敏感不会报错,但统一字段名写法可以避免开启大小写敏感排序规则时出现字段找不到的异常。
内容的提问来源于stack exchange,提问作者Bryan Dellinger
相关产品推荐
相关产品推荐

