2016-04-20 56 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来编写所需的其他语法。