有效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
相关产品推荐
相关产品推荐

