2012-12-03 59 views
0

我试图运行一个查询,它将在其输出中包含静态列。 select语句的作品时,我通过CLP运行它,而不是当我一个shell脚本中执行:如何在db2 sql查询中运行撇号,在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

回答

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;' 

当心,我没有测试它...手头没有外壳刚才。

UPDATE:

最后我一点点的测试,我得到它的工作后得到了我的手在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;' 
+0

谢谢您的回复@卡罗 - 佩莱格里尼 尝试,并得到了以下** 0403- 057第6行的语法错误:'“'不匹配** – fembot

+0

@fembot答案已更新(并已测试过) –

+0

工作正常!非常感谢!我永远不会发现这件事。感谢您对此的帮助! – fembot