ADF dataflow执行动态SQL时如何转义单引号解决解析报错
问题场景
在ADF数据流中执行动态传入的数据库查询SQL:select * from schema.country where country_code='abc' and country='INDIA'
因执行时数据流会自动给传入的输入内容额外包裹单引号,SQL内原有单引号未做转义就会触发语法解析错误,且要求不在数据流内部硬编码SQL内容,可通过以下方式解决:
可行解决方案
方案1:手动双写单引号做SQL原生转义
SQL语法本身支持用两个连续的英文单引号表示字符串内的字面单引号,你可以在传入动态SQL前,把SQL里所有的单个单引号替换为两个连续单引号,刚好抵消ADF自动添加外层单引号带来的转义问题。
转义后的SQL写法如下:select * from schema.country where country_code=''abc'' and country=''INDIA''注意:这里是两个连续的英文半角单引号,不是一个双引号,字符写错会依旧触发语法错误。
方案2:用表达式函数自动预处理,无需手动修改SQL
如果你的动态SQL是通过管道参数、变量传入数据流的,不需要手动调整SQL内容,直接在数据流源的动态查询配置里,用replace()函数自动完成单引号替换即可,表达式写法:replace(@pipeline().parameters.dynamicSqlQuery, '''', '''''')
上述表达式的逻辑是:识别传入SQL参数里的所有单个单引号,自动替换为两个连续单引号,全程不需要硬编码固定SQL内容,适配任意动态传入的查询语句。
补充说明:ADF表达式语法中,单引号本身需要用连续两个单引号转义,因此四个连续单引号代表一个字面单引号,六个连续单引号代表两个连续字面单引号。方案3:排查配置避免重复包裹引号
很多场景下自动加引号的问题来自配置错误:配置数据流源的动态查询时,不要在动态内容表达式外层手动包裹单引号,直接输出拼接完成的SQL文本即可,额外手动加引号会和系统自动添加的引号形成两层包裹,直接触发解析错误。
验证方式
配置完成后可使用数据流的「数据预览」功能,查看最终下发到数据库执行的实际SQL文本,确认字符串条件的单引号正常成对闭合,没有出现多层嵌套的情况即可正常运行。
内容的提问来源于stack exchange,提问作者Manasa Murugan

