动态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
相关产品推荐
相关产品推荐

