You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态T-SQL WITH语句执行报错求助

解决动态T-SQL中WITH语句的语法错误问题

我一眼就看出问题所在了——你定义的CTE(WITH子句)在动态SQL里单独“悬空”了!SQL Server要求CTE定义之后必须立即跟上使用它的查询语句,不能只定义完CTE就结束,这就是为什么静态执行没问题(静态代码里你肯定在CTE后面写了SELECT或者其他操作),但动态执行就报语法错误的原因。

咱们来拆解下你的原代码:拼接后的动态SQL最后只有),没有任何使用DCODES这个CTE的逻辑,SQL Server解析到这里就会觉得“你定义了CTE但不用?语法不对啊”,所以抛出Incorrect syntax near ')'的错误。

修复方案

你需要在动态拼接的CTE定义后面,添加一段使用这个CTE的查询语句,比如你实际需要的SELECT、INSERT或者其他操作。同时建议你先打印出生成的动态SQL,手动检查语法是否正确,这是排查动态SQL问题的常用技巧。

修改后的代码示例:

PRINT 'Convert References into XML fields'
SET @query = N';WITH DCODES AS (' 
             + 'SELECT [id],[Codes],' 
             + 'CAST(''<M>'' + REPLACE([Codes],'','' , ''</M><M>'') + ''</M>'' AS XML) AS [XML_Codes],' 
             + 'CAST(''<M>'' + REPLACE(REPLACE([Descriptions],''&'',''AND''),'','',''</M><M>'') + ''</M>'' AS XML) AS [XML_Desc] ' 
             + 'FROM ##' + @system_name + '_Temp)'
             + 'SELECT * FROM DCODES; -- 替换成你实际需要的业务逻辑,比如INSERT到目标表'
EXEC sp_executesql @query

额外建议

  • 每次调试动态SQL时,先执行PRINT @query,把生成的SQL语句复制出来手动执行,这样能快速发现拼接中的空格缺失、引号不匹配等问题。
  • 如果你的业务逻辑是把CTE的数据插入到某个表,只需要把示例中的SELECT * FROM DCODES改成对应的INSERT INTO ... SELECT ... FROM DCODES即可。

内容的提问来源于stack exchange,提问作者Peter Sun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:45:35