【问题标题】:Using Parameters in OPENQUERY在 OPENQUERY 中使用参数
【发布时间】:2016-04-05 10:35:39
【问题描述】:

我有一个名为MMSHO 的链接服务器连接。 Oracle 服务器中有一个参数化函数,我想通过OPENQUERY 发送存储代码,然后在 where 条件下过滤。 :

DECLARE
       @OPENQUERY   NVARCHAR (MAX),
       @STOREID     VARCHAR (2),
       @ARTICLEID   VARCHAR (10),
       @SQL         NVARCHAR (MAX)

SET @STOREID = 10;
SET @ARTICLEID = 245511;
SET @OPENQUERY = 'SELECT *
                  FROM OPENQUERY (MMSHO,
                      ''SELECT MS000'
           + @STOREID
           + '77TRP.MW070K01.MW070P01_REKE@MS000'
           + @STOREID
           + '77TRP(ART_NR, VAR, GEBI_NR) AS ARTICLE_NNBP
                                    FROM MS000'
           + @STOREID
           + '77TRP.MW_MA_VAR_GEBI_SNAP@MS000'
           + @STOREID
           + '77TRP
                                    WHERE SUBSYS_ART_NR = '
           + @ARTICLEID
           + '''';

    SET @SQL =
             'SELECT STORE_NO,
           SUBSYS_ART_NO,
           ARTICLE_NO,
           ARTICLE_DESC,
           PUAR,
           SUPPLIER_NO,
           SORTEN_TEXT AS ARTICLE_VARIANT,
           GEBI_NR,
           BLOCK_CD,
           PACKAGE_CONTENT AS CONTENT,
           PACKAGE_TYPE AS CONTENT_TYPE,
           VAT AS ARTICLE_VAT,'
           + CHAR (13)
           + '('
           + @OPENQUERY
           + ') AS ARTICLE_NNBP,
           ARTICLE_NNSP,
           STOCK_QTY AS ARTICLE_STOCK,
           CASE WHEN DEPT_NO IS NULL THEN 0 ELSE DEPT_NO END DEPARTMENT
           FROM ARTICLE
           WHERE STORE_NO = 10 AND SUBSYS_ART_NO = 245511'

    PRINT (@SQL)

当我使用EXEC (@SQL) 运行上述查询时,SQL Server 会抛出错误:

消息 156,第 15 级,状态 1,第 20 行
关键字“CASE”附近的语法不正确。

消息 102,第 15 级,状态 1,第 20 行
“DEPARTMENT”附近的语法不正确。

我试图删除 OPENQUERYFROM 关键字之间的行,但没有成功。我究竟做错了什么?你能帮帮我吗?

打印查询

SELECT STORE_NO,
       SUBSYS_ART_NO,
       ARTICLE_NO,
       ARTICLE_DESC,
       PUAR,
       SUPPLIER_NO,
       SORTEN_TEXT AS ARTICLE_VARIANT,
       GEBI_NR,
       BLOCK_CD,
       PACKAGE_CONTENT AS CONTENT,
       PACKAGE_TYPE AS CONTENT_TYPE,
       VAT AS ARTICLE_VAT,
       (SELECT *
          FROM OPENQUERY (
                  MMSHO,
                  'SELECT MS0001077TRP.MW070K01.MW070P01_REKE@MS0001077TRP(ART_NR, VAR, GEBI_NR) AS ARTICLE_NNBP
                                FROM MS0001077TRP.MW_MA_VAR_GEBI_SNAP@MS0001077TRP
                                WHERE SUBSYS_ART_NR = 245511') AS ARTICLE_NNBP,
       ARTICLE_NNSP,
       STOCK_QTY AS ARTICLE_STOCK,
       CASE WHEN DEPT_NO IS NULL THEN 0 ELSE DEPT_NO END DEPARTMENT
       FROM ARTICLE
       WHERE STORE_NO = 10 AND SUBSYS_ART_NO = 245511

【问题讨论】:

  • 为什么在执行查询后选择单引号
  • 亲爱的莫汉,我不明白,你的意思是什么?
  • 在第二个查询中为什么 'SELECT MS0001077TRP.MW070K01' 显示在单引号中
  • 因为 SQL Server 要用单引号括起来!
  • OPENQUERY 子查询末尾的 AS ARTICLE_NNBP 之前似乎缺少右括号。

标签: sql sql-server database openquery


【解决方案1】:

关于右括号的问题,感谢@marcello-miorelli 的帮助。

应该是这样的:

   (SELECT *
      FROM OPENQUERY (
              MMSHO,
              'SELECT MS0001077TRP.MW070K01.MW070P01_REKE@MS0001077TRP(
ART_NR, VAR, GEBI_NR) AS ARTICLE_NNBP
FROM MS0001077TRP.MW_MA_VAR_GEBI_SNAP@MS0001077TRP
WHERE SUBSYS_ART_NR = 245511') AS ARTICLE_NNBP),

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多