需要sqsh忽略美元符号

时间:2013-07-19 19:58:05

标签: sql-server sqsh

环境: 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。你是我唯一的希望。

2 个答案:

答案 0 :(得分:2)

另一种选择是通过执行以下命令来完全禁用缓冲区扩展:

\set expand=0
在sqsh提示符下

,或在.sqshrc文件中指定此命令,或使用参数

启动sqsh
sqsh -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或类似的东西尝试。