2016-04-20 55 views
0

我有以下SQL OPENQUERY爲什麼慣於此查詢工作

SELECT  @TSQL = 'SELECT * FROM OPENQUERY(RMSPROD2,''SELECT COUNT(DISTINCT W.Bond) AS NoBID_Count 
               FROM TIB.WRMAST w 
               WHERE (w.BID In (''No Bid'', ''No Cost'', ''None'') AND w.CtlNumber = ''''' + @WarControlID + ''''''')' 

當我運行此查詢我得到以下錯誤:

SELECT * FROM OPENQUERY(RMSPROD2,'SELECT COUNT(DISTINCT W.Bond) AS NoBond_Count 
               FROM TIBURON.WRMAST w 
               WHERE (w.Bond In ('No Bond', 'No Bail', 'None') AND w.CtlNumber = ''575403''') 
Msg 102, Level 15, State 1, Line 3 
Incorrect syntax near 'No'. 

什麼是被拋出我沒有錯誤在任何問題,在設計窗口的指示

+0

爲什麼要爲您的查詢構建文本字符串?爲什麼不直接運行它? – n8wrl

+0

我看到帶有Print @ TSQL的錯誤消息顯示了不同的WHERE子句,但發佈該問題時,這是我的錯誤。無需編輯即可剪切和粘貼。 – Perry

+0

您應該更新與實際的代碼和錯誤的問題。 –

回答

2

你的問題的根本原因是你無意間在這裏封閉開口報價:

SELECT * FROM OPENQUERY(RMSPROD2,'SELECT COUNT(DISTINCT W.Bond) AS NoBond_Count 
               FROM TIBURON.WRMAST w 
               WHERE (w.Bond In (' 

因此你越來越靠近號在java中,例如錯誤,\是轉義字符,所以以確保連續性,我們會寫:

"SELECT COUNT(DISTINCT W.Bond) AS NoBond_Count 
                FROM TIBURON.WRMAST w 
                WHERE (w.Bond In (\'  " //till the end 

尋找在適當的轉義字符您選擇的語言並應用它。

+0

@FernandoGutierrez,我的答案已被java格式化。在java中,你可以寫{String SQL =「從雙選擇d​​ummy」}。如果您在Oracle中輸入select dual選項,則會看到列名稱爲DUMMY,全部爲大寫。如果你想確保區分大小寫,你必須從雙重選擇「虛擬」。爲了在Java中實現這一點,我們必須編寫String SQL =「select \」Dummy \「from dual」;這就是我解釋的。基本上,適當使用轉義字符。 –

+0

對不起,我不是故意評論你的答案,我試着對這個問題發表評論。我會刪除我的評論,因爲它與你的答案無關。 –

1

我認爲你缺少了幾個'角色,嘗試下:

SELECT  @TSQL = 'SELECT * FROM OPENQUERY(RMSPROD2,''SELECT COUNT(DISTINCT W.Bond) AS NoBID_Count 
              FROM TIB.WRMAST w 
              WHERE (w.BID In (''''No Bid'''', ''''No Cost'''', ''''None'''') AND w.CtlNumber = ''''' + @WarControlID + ''''''')' 
+0

我覺得你有辦法*太多*字符!逃跑時你只需要2個撇號,但由於某種原因,你有4個撇號。 – Zack

0

所以我用不同的方法去我找不到回答這個問題。我用這個代碼使用OpenQuery

SELECT @TSQL = 'SELECT * FROM OPENQUERY(RMSPROD2,''SELECT TIB.WRMAST.WR_INVL, TIB.WRMAST.WR_WARR_CTL,TIBURON.WRMAST.WR_BAIL,TIB.WRWCHG.WC_BAIL 
         FROM TIB.WRMAST 
         LEFT JOIN TIBURON.WRWCHG 
         ON WRWCHG.WC_WR_CHAIN = WRMAST.WRMAST_ROW 
         WHERE TIBURON.WRMAST.WR_WARR_CTL = ''''' + @WarControlID + ''''''')' 
Insert Into @WarrantBail 
    EXEC (@TSQL) 

並將結果放入臨時表中。然後,我可以使用常規的T-SQL來編寫所需的其他語法。