0

环境: Solaris 10,使用 sqsh 和 freetds 与 MS SQL Server 对话的 /bin/sh 脚本

(TLDR) 问题: 我需要 sqsh 忽略美元符号并将其传递给 MS SQL。

背景: 我正在编写一些动态构建 SQL 以更改现有索引的代码,但是当它运行时,出现错误:

Msg 2727, Level 11, State 1
Server 'HOST\SERVER', Line 1
Cannot find index 'foo'.

我四处寻找,发现没有 index namedfoo但有一个named foo$bar

构建的输入 SQL 输入看起来不错...

% grep 'foo' input.sql
alter index [foo$bar] on ...

...并通过新查询会话或第三方应用程序成功运行此 SQL。但是,通过 sqsh 时的结果看不到那个美元符号:

% sqsh -e -i input.sql -o output.sql
% grep 'foo' output.sql
1> alter index [foo] on ...

...这表明它被解释$bar为变量或其他东西。

任何人都知道如何让 sqsh 逃脱美元符号或允许一个通过?我尝试了各种引号和反斜杠的组合。

帮帮我,stackoverlow。你是我唯一的希望。

4

2 回答 2

2

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

\set expand=0

在 sqsh 提示符下,或在 .sqshrc 文件中指定此命令,或使用参数启动 sqsh

sqsh -e -i input.sql -o output.sql -Lexpand=0

如果展开是打开的(默认),那么 sqsh 将用变量 $bar 替换它的内容。

于 2013-10-12T16:28:02.350 回答
1

第 5 页的参考手册指出:“请注意,为了防止变量扩展,请使用单引号或两个 \,如下所示:

1> \echo \\$name
$name

所以,我相信为了防止 sqsh 用空字符串替换 $bar,你必须写如下内容:

alter index [foo\\$bar] on ...
alter index ['foo$bar'] on ...

要对其进行测试,您可以先尝试使用 SELECT'foo\\$bar' = 1或类似的东西。

于 2013-07-19T20:46:07.010 回答