环境: Solaris 10,/ bin / sh脚本使用sqsh和freetds与MS SQL Server通信
(TLDR)问题: 我需要sqsh忽略一个美元符号并将其传递给MS SQL。
背景: 我正在编写一些动态构建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 ...
...并通过New Query会话或第三方应用程序运行此SQL成功。但是,通过sqsh传递的结果看不到该美元符号:
% sqsh -e -i input.sql -o output.sql
% grep 'foo' output.sql
1> alter index [foo] on ...
...这表明它将$bar
解释为变量或其他东西。
任何人都知道如何让sqsh逃脱一个美元符号或允许一个人通过?我尝试了各种引号和反斜杠的组合。
帮帮我,stackoverlow。你是我唯一的希望。
答案 0 :(得分:2)
另一种选择是通过执行以下命令来完全禁用缓冲区扩展:
\set expand=0
在sqsh提示符下,或在.sqshrc文件中指定此命令,或使用参数
启动sqshsqsh -e -i input.sql -o output.sql -Lexpand=0
如果启用扩展(默认),则sqsh将使用其内容替换变量$ bar。
答案 1 :(得分:1)
第5页的参考手册指出:“请注意,为了防止变量的扩展使用单引号或两个引号,如下所示:
1> \echo \\$name
$name
所以,我相信为了防止sqsh用空字符串替换$ bar,你必须写下这样的东西:
alter index [foo\\$bar] on ...
alter index ['foo$bar'] on ...
要测试它,您可以先使用SELECT 'foo\\$bar' = 1
或类似的东西尝试。