如何在shell脚本中运行的db2 sql查询中转义撇号?

时间:2012-12-03 20:23:14

标签: sql shell db2

我正在尝试运行一个在其输出中包含静态列的查询。当我通过CLP运行select语句时,select语句有效,但是当我在shell脚本中执行它时,它不起作用:

su - myid -c 'db2 connect to mydb;db2 -x -v "select COL1,'','',COL2,'','',COL3L from MYTABLE fetch first 10 rows only"; db2 connect reset;'

当我运行它时,我得到的输出错误是:

SQL0104N  An unexpected token "," was found following "select COL1,".
Expected tokens may include:  "<select_sublist>".  SQLSTATE=42601

SQL1024N  A database connection does not exist.  SQLSTATE=08003

我甚至尝试将select语句放在变量中并将其插入语句中,但仍然是相同的错误。任何帮助将不胜感激。 -Thx

1 个答案:

答案 0 :(得分:2)

你应该像使用反斜杠一样转义单引号:

su - myid -c 'db2 connect to mydb;db2 -x -v "select COL1,\'\',\'\',COL2,\'\',\'\',COL3L from MYTABLE fetch first 10 rows only"; db2 connect reset;'

小心,我没有测试它......现在没有手头的外壳。

<强>更新

最后,我得到了一个DB2实例..经过一些测试后,我得到了它的工作。 事实证明,以前的语法是错误的。引用单引号的正确方法是(在这种情况下)'\'',如:

su - myid -c 'db2 connect to mydb;db2 -x -v "select COL1,'\'','\'',COL2,'\'','\'',COL3L  from MYTABLE fetch first 10 rows only"; db2 connect reset;'

这是因为必须关闭整个命令的单引号('),以便为db2查询(\')中的单引号提供转义,然后重新打开以恢复命令引用(')。看起来很奇怪,它有效......

这是我用来测试它的命令:

bash -c 'db2 connect to mydb;db2 -x -v "select 1,'\'','\'',2,'\'','\'',3  from SYSIBM.SYSDUMMY1 fetch first 10 rows only"; db2 connect reset;'