环境: Solaris 10,/bin/sh脚本使用sqsh和freetds与MS对话
(TLDR)问题:我需要sqsh忽略一个美元符号并将其传递给MS。
背景:我正在编写一些动态构建SQL以更改现有索引的代码,但是当它运行时,我会得到错误:
Msg 2727, Level 11, State 1
Server 'HOST\SERVER', Line 1
Cannot find index 'foo'.我四处搜索,发现没有名为foo的索引,但有一个名为foo$bar的索引。
内置的SQL输入看起来很好.
% grep 'foo' input.sql
alter index [foo$bar] on ...通过新查询会话或第三方应用程序运行此SQL的...and成功。然而,当通过sqsh时,结果并没有超过这个美元符号:
% sqsh -e -i input.sql -o output.sql
% grep 'foo' output.sql
1> alter index [foo] on ......which建议将$bar解释为一个变量或什么的。
有人知道如何让sqsh逃脱一个美元的标志或允许一个通过?我试过各种引号和反斜杠的组合。
帮帮我,堆积如山。你是我唯一的希望。
发布于 2013-07-19 20:46:07
第5页的参考手册指出:“请注意,为了防止变量的扩展,可以使用单引号或两个单引号,例如:
1> \echo \\$name
$name因此,为了防止sqsh用空字符串替换$bar,您必须编写如下内容:
alter index [foo\\$bar] on ...
alter index ['foo$bar'] on ...要测试它,您可以先尝试选择'foo\\$bar' = 1或其他类似的方法。
发布于 2013-10-12 16:28:02
另一种选择是通过执行以下命令完全禁用缓冲区扩展:
\set expand=0在sqsh提示符上,或在.sqshrc文件中指定此命令,或使用参数启动sqsh。
sqsh -e -i input.sql -o output.sql -Lexpand=0如果展开是打开的(默认),那么sqsh将用其内容替换变量$bar。
https://stackoverflow.com/questions/17754492
复制相似问题