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

有效OPENQUERY在BCP动态脚本中执行失败问题求助

问题描述

单独执行以下OPENQUERY语句可正常运行:

SELECT * FROM OPENQUERY([MYSQL], 'SELECT REPLACE(description,''/'','''') as description2, length(description) as DescriptionLength, length(example) as ExampleLength FROM `mysql`.`help_topic` ORDER BY `name`')

但将其整合到BCP输出的动态脚本中时执行失败:

declare @sql varchar(8000)
select @sql = 'bcp "SELECT * FROM OPENQUERY([MYSQL], ''SELECT REPLACE(description,''/'','''') as description2, length(description) as DescriptionLength, length(example) as ExampleLength FROM `mysql`.`help_topic` ORDER BY `name`'')" queryout "C:\TEST_MySQL\NEW_TOO.txt" -c -t"\"~\"" -r"\"\n\"" -T -S'+ @@servername
exec master..xp_cmdshell @sql

报错信息:

Error = [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Incorrect syntax near '/'.
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 11 for SQL Server]Unable to resolve column level collations
BCP copy out failed

将内部SELECT语句中的REPLACE(description,''/'','''') as description2替换为*时,BCP语句可正常运行,请问问题原因是什么?

问题原因

核心问题是多层字符串嵌套时的引号转义逻辑错误,导致SQL Server解析BCP命令中的嵌套SQL时出现语法混乱:

  • 单独执行OPENQUERY时,内部MySQL语句里的单引号用两个单引号转义(''/')符合SQL Server的字符串规则,能正确传递给MySQL执行。
  • 但嵌套到BCP动态脚本后,整个语句被多层包裹:外层是@sql的单引号字符串,中间是BCP命令的双引号(用"转义),再内层是OPENQUERY的单引号,最内层是MySQL语句的单引号转义。
  • 这种多层嵌套下,REPLACE(description,''/'','''')里的单引号转义会被多次解析破坏,最终SQL Server拿到的语句中,/'部分变成未正确转义的非法语法,触发"Incorrect syntax near '/'"错误。
  • 替换为*后,语句没有复杂的引号转义需求,多层嵌套的字符串解析不会出错,因此BCP能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:42:37