【问题标题】:Why wont this query work为什么这个查询不起作用
【发布时间】:2016-04-20 19:57:07
【问题描述】:

我有以下 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'.

抛出的错误是什么我在设计窗口中没有任何问题的迹象

【问题讨论】:

  • 为什么要为查询构建文本字符串?为什么不直接运行它?
  • 我看到 Print@TSQL 的错误消息显示了一个不同的 WHERE 子句,但是在我发布问题时这是一个错误。无需编辑即可剪切和粘贴。
  • 您应该使用实际代码和错误更新问题。
  • 我正在对 oracle 链接服务器运行查询,而 OpenQUERY 不允许变量
  • 如果我知道如何做到这一点,我很乐意更新问题

标签: sql sql-server openquery


【解决方案1】:

问题的根本原因是您无意中关闭了此处的开场白:

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

因此您会在 No 附近收到错误。例如,在 java 中,\ 是转义字符,因此为了确保连续性,我们必须编写:

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

在您选择的语言中搜索适当的转义字符并应用它。

【讨论】:

  • @FernandoGutierrez,我的答案是 java 格式的。在 java 中,您可以编写 {String SQL="Select dummy from dual"}。如果您在 Oracle 中键入 select dummy from dual,您将看到列名返回为 DUMMY,全部大写。如果要确保区分大小写,则必须从 dual 中编写 select "Dummy"。为了在 Java 中实现这一点,我们必须编写 String SQL ="select \"Dummy\" from dual";这就是我解释的。基本上,适当使用转义字符。
  • 对不起,我不是想评论你的答案,我试图评论这个问题。我将删除我的评论,因为它与您的答案无关。
【解决方案2】:

我认为您缺少几个 '' 字符,请尝试下一个:

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 + ''''''')'

【讨论】:

  • 我认为你的字符太多了!转义它们时只需要 2 个撇号,但由于某种原因你有 4 个。
【解决方案3】:

我找不到这个问题的答案所以我采用了不同的方法。我在这段代码中使用了 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 来编写其余所需的语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多