2013-07-19 14 views
0

環境: 的Solaris 10,/用SQSH和freetds的交談的MS SQL Server的需要SQSH忽略一個美元符號

的(TLDR)問題bin/sh的腳本: 我需要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 ... 

...並通過運行一個新的查詢會話或該SQL第三方應用成功。然而,當通過SQSH傳遞的結果沒有看到過去那個美元符號:

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

...這表明它的解釋$bar作爲變量或東西。

任何人都知道如何讓sqsh逃脫一個美元符號或允許一個通過?我試過了引號和反斜槓的各種組合。

幫助我,stackoverlow。你是我唯一的希望。第5頁的狀態

回答

1

參考手冊:「需要注意的是,爲了防止變量使用的擴展單引號,或兩個\的,就像這樣:

1> \echo \\$name 
$name 

所以,我相信,爲了防止SQSH替代$酒吧,一個空字符串,你必須寫類似:

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

爲了測試它,你可以先嚐試使用SELECT 'foo\\$bar' = 1或類似的東西

+0

這正是我試圖找到的文檔參考和解決方案。快速重寫並按預期運行SQL。非常感謝你。 –

1

另一種選擇是通過執行完全禁用緩衝器擴展:

\set expand=0 

在SQSH提示,或在.sqshrc文件中指定該命令,或與該參數開始SQSH

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

如果展開(默認),那麼sqsh將用​​其內容替換變量$ bar。