如何使 MS Access 直通查询在 SQL Server 中正确运行

Posted

技术标签:

【中文标题】如何使 MS Access 直通查询在 SQL Server 中正确运行【英文标题】:How to make MS Access pass-through query run correctly in SQL Server 【发布时间】:2012-04-23 03:24:04 【问题描述】:

当我从使用 odbc 连接的 Microsoft Access 运行此传递查询时,它工作正常:

SELECT   b.PRODUCT, b.UPC_NBR, b.EAN_NBR, b.NAME AS ProductDescription, b.AUTHOR, 
     o.RETAILER, o.REFER_NBR, o.ARDESC, a.NAME, o.TRAN_DATE, 
     o.QTY, o.RETAIL, o.PRICE, o.COST

FROM    BOOK_MASTER_REC as b JOIN 
    ORBDETL_RECORD as o ON ISBN_TITLE = o.TITLE 
                 AND ISBN_PUBLISHER = o.BK_PUBL 
                 AND BOOK_GROUP = o.BK_GROUP  
                 AND BOOK_PREFIX = o.BK_PREFIX JOIN 
    ARDESC_RECORD as a ON o.ARDESC = a.ARDESC 

WHERE b.PRODUCT Between 600 And 698

当我从通过链接服务器使用相同 odbc 连接的 SMSS 运行相同查询时,它会失败:

SELECT b.PRODUCT, b.UPC_NBR, b.EAN_NBR, b.NAME AS ProductDescription, b.AUTHOR, 
     o.RETAILER, o.REFER_NBR, o.ARDESC, a.NAME, o.TRAN_DATE, 
     o.QTY, o.RETAIL, o.PRICE, o.COST

FROM    DPS_GPR..root.BOOK_MASTER_REC as b INNER JOIN 
    DPS_GPR..root.ORBDETL_RECORD as o ON ISBN_TITLE = o.TITLE 
                         AND ISBN_PUBLISHER = o.BK_PUBL 
                         AND BOOK_GROUP = o.BK_GROUP  
                         AND BOOK_PREFIX = o.BK_PREFIX INNER JOIN 
    DPS_GPR..root.ARDESC_RECORD as a ON o.ARDESC = a.ARDESC 

WHERE b.PRODUCT Between 600 And 698

它给出了以下错误:

链接服务器“DPS_GPR”的 OLE DB 提供程序“MSDASQL”返回消息 “[Transoft][TSODBC][usqlsd]')' 此处应为 (FROM)”。消息 7321,级别 16, State 2, Line 2 准备查询时出错 “选择 Col1061,Col1062,Col1064,Col1065,Col1066,Col1042,Col1048,Col1049,Col1050,Col1051,Col1052,Col1053,Col1054,Tbl1005.NAME Col1040 FROM root.ARDESC_RECORD Tbl1005,(选择 Col1057,Col1058,Col1059,Col1060,Col1061,Col1062,Col1064,Col1065,Col1066,Tbl1003.零售商 Col1042,Tbl1003.BK_PREFIX Col1043,Tbl1003.BK_GROUP Col1044,Tbl1003.BK_PUBL Col1045,Tbl1003.TITLE Col1046,Tbl1003.REFER_NBR Col1048,Tbl1003.ARDESC Col1049,Tbl1003.TRAN_DATE Col1050,Tbl1003.QTY Col1051,Tbl1003.RETAIL Col1052,Tbl1003.PRICE Col1053,Tbl1003.COST Col1054,Col1067,Col1063,Tbl1003.SEQ Col1047,Tbl1003.PROCESSED_FLAG Col1055 FROM root.ORBDETL_RECORD Tbl1003,(SELECT Tbl1001.BOOK_PREFIX Col1057,Tbl1001.BOOK_GROUP Col1058,Tbl1001.ISBN_PUBLISHER Col1059,Tbl1001.ISBN_TITLE Col1060,Tbl1001.UPC_NBR Col1061,Tbl1001.EAN_NBR Col1062,Tbl1001.NAME Col1064,Tbl1001.AUTHOR Col1065,Tbl1001.产品 Col1066,Tbl1001.CATEGORY9 Col1067,Tbl1001.BOOK_NUMBER Col1063 FROM root.BOOK_MASTER_REC Tbl1001 WHERE Tbl1001.PRODUCT>=(600.) AND Tbl1001.PRODUCT

在我试图摆脱 MS Access 时,如果我能通过 SQL Server 实现这一点,我将不胜感激。

【问题讨论】:

您的四部分表名参考(“DPS_GPR..root.BOOK_MASTER_REC”)看起来很奇怪。你能解释一下为什么你在第二个位置什么都没有,而在第三个位置没有“根”吗?这不一定是错误的,但它是相当不寻常的。 @RBarryYoung 伙计,我希望我知道因为我一直在想同样的事情。我所知道的是,这是将 ODBC 驱动程序用于专有数据库,并且我知道当我“SELECT * FROM DPS_GPR..root.TableName”时它工作正常。但显然它没有很好地处理来自 SSMS 的这些连接。 仅供参考,我想尝试这种方式的唯一原因是因为在 MS Access 中我看到链接是“root.BOOK_MASTER_REC”。所以我试了一下,它奏效了。 【参考方案1】:

我能够通过使其成为传递查询来完成这项工作。

SELECT * FROM OPENQUERY(DPS_GPR, 'select ... blah blah blah ...')

没有我希望的那样理想的解决方案,但它确实有效。

【讨论】:

以上是关于如何使 MS Access 直通查询在 SQL Server 中正确运行的主要内容,如果未能解决你的问题,请参考以下文章

到 SQL Server 的 MS Access 通用直通查询

MS Access 直通查询更新

MS Access 直通查询 - 使用 ODBC 连接字符串时非常慢,手动选择数据源时速度快 - 问题出在哪里

直通查询如何提高速度?

更新查询的 MS Access SQL 错误

MS Access 取消执行直通查询键盘快捷键