Bash脚本执行BQ插入SQL时如何转义插入值中的单引号
BigQuery Shell执行插入语句单引号报错解决方案
报错根因
你使用单引号包裹整个SQL作为bq命令的入参,而Shell的单引号语法规则中,单引号内部不允许转义单引号,SQL里Don't携带的单引号会提前闭合外层的单引号,导致整条命令解析失败。
可用解决方法
- 方法1:Shell单引号特殊转义
要在Shell单引号包裹的内容中输出单引号,使用'\''格式转义即可,修改后命令如下:
bq query --use_legacy_sql=false --label lm:<local_mkt> --label env:<env_var> ' INSERT INTO `<project>.<dataset_source>.reason_table`(cd,cd1,cd2,cd3,`desc`,dec1) VALUES(1,"DCV","AB","AB","SDF","I Don'\''t")'
额外提示:desc是SQL保留关键字,作为字段名使用时建议加反引号包裹,避免触发BQ的SQL语法报错。
- 方法2:切换外层包裹符为双引号
将外层包裹SQL的单引号改为双引号,只需要转义内部的双引号和反引号即可,不需要处理单引号:
bq query --use_legacy_sql=false --label lm:<local_mkt> --label env:<env_var> " INSERT INTO `<project>.<dataset_source>.reason_table`(cd,cd1,cd2,cd3,\`desc\`,dec1) VALUES(1,\"DCV\",\"AB\",\"AB\",\"SDF\",\"I Don't\")"
- 方法3:用Heredoc传入SQL(复杂场景优先)
如果SQL逻辑复杂、包含大量特殊字符,推荐使用Heredoc的方式传参,几乎不需要额外转义:
bq query --use_legacy_sql=false --label lm:<local_mkt> --label env:<env_var> <<EOF INSERT INTO `<project>.<dataset_source>.reason_table`(cd,cd1,cd2,cd3,`desc`,dec1) VALUES(1,"DCV","AB","AB","SDF","I Don't") EOF
内容的提问来源于stack exchange,提问作者Yug
相关产品推荐
相关产品推荐

