使用 OPENQUERY 语法通过链接服务器 (SQL Server 2005) 调用 MySQL 存储过程(带参数)的问题

Posted

技术标签:

【中文标题】使用 OPENQUERY 语法通过链接服务器 (SQL Server 2005) 调用 MySQL 存储过程(带参数)的问题【英文标题】:Issue calling a MySQL stored procedure (with params) via a linked server (SQL Server 2005) using OPENQUERY syntax 【发布时间】:2010-12-04 22:22:39 【问题描述】:

我在尝试使用 OPENQUERY 语法通过链接服务器 (SQL Server 2005) 调用带有参数的 mysql (5.0.77) 存储过程时遇到问题。

MySQL 存储过程返回一个结果集,当我使用 'EXEC ... AT ...' 语法时,调用工作正常,例如...

EXEC('CALL my_stored_proc(''2009-10-07'',''2009-10-07'');') AT MySQLSERVER;

使用“EXEC ... AT ...”的限制意味着我无法将结果集插入到 SQL Server 中的临时表中,这最终是我想要做的。这导致我尝试使用 OPENQUERY 语法...

SELECT * FROM OPENQUERY(MySQLSERVER,'CALL my_stored_proc(''2009-10-07'',''2009-10-07'');')

...但这失败了,然后返回...

 Msg 7357, Level 16, State 2, Line 1
 Cannot process the object "CALL my_stored_proc(''2009-10-07'',''2009-10-07'');". The OLE DB provider "MSDASQL" for linked server "MySQLSERVER" indicates that either the object has no columns or the current user does not have permissions on that object.

这很奇怪,因为“EXEC ... AT ...”调用没有抱怨权限。以下调用都可以正常工作...

EXEC('SHOW TABLES;') AT MySQLSERVER;

SELECT * FROM OPENQUERY(MySQLSERVER,'SHOW TABLES;');

CREATE TABLE #tmpTest (
    [table] varchar(255) null
);
INSERT INTO #tmpTest ([table])
SELECT * FROM OPENQUERY(MySQLSERVER,'SHOW TABLES;');
SELECT * FROM #tmpTest;
DROP TABLE #tmpTest;

所以我的问题是,如何通过链接服务器调用 MySQL 存储过程,并将结果集存储在 SQL Server 的临时表中?通过使用“EXEC ... AT ...”语法,或者在使用 OPENQUERY 语法时解决对象/权限错误。

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

您需要在 SQL Server 上启用“Ad Hoc Distributed Queries”。出于安全原因,默认情况下不启用此功能。大多数情况下,“没有权限”错误与此有关。

在 SQL Server 上执行此操作,然后重试您的代码:

EXEC sp_configure '显示高级选项', 1; 走 重新配置; 走 EXEC sp_configure 'Ad Hoc 分布式查询', 1; 走 重新配置; 走

希望对你有帮助。

【讨论】:

【参考方案2】:

我尝试了配置“Ad Hoc Distributed Queries”的修复程序,但仍然遇到同样的错误:

“链接服务器“MyMySQL”的 OLE DB 提供程序“MSDASQL”表示 对象没有列或当前用户没有 拥有该对象的权限。”

我正在尝试对链接的 MySQL 数据库进行简单的远程 SELECT 查询。 就我而言,我尝试的查询看起来像这样。注意使用的行数:

SELECT * FROM  OPENQUERY
([MyMySQL], 
'
SELECT
ID as ISSUE_ID, etc..

修复是在打开单引号后删除换行符。很简单吧?但不明显。

工作代码如下所示:

SELECT * FROM  OPENQUERY
([MyMySQL], 
'SELECT
ID as ISSUE_ID, etc..

希望对您有所帮助! 抢

【讨论】:

【参考方案3】:

我意识到这是一篇相当老的帖子,但我的问题与 Rob 的问题相似,因为 OPENQUERY 中的 SQL 不像 SQL Server 那样将换行符作为空格。

即如下布置我的查询:

SELECT
    *
FROM
    OPENQUERY(LINKEDSERVER, '
        SELECT
            SomeField
        FROM
            SomeTable
    ')

需要有空格,就像写在一行上一样(使用_作为演示的可见空格):

SELECT
    *
FROM
    OPENQUERY(LINKEDSERVER, '
        SELECT_
            SomeField_
        FROM_
            SomeTable
    ')

【讨论】:

以上是关于使用 OPENQUERY 语法通过链接服务器 (SQL Server 2005) 调用 MySQL 存储过程(带参数)的问题的主要内容,如果未能解决你的问题,请参考以下文章

多部分标识符无法与交叉应用绑定到具有 OPENQUERY 的链接服务器功能

使用 Openquery 链接服务器更新表

sql 使用MS SQL链接服务器连接到Active Directory并使用OpenQuery进行查询

无法在链接服务器上运行 openquery

SQL: OPENQUERY 问题

将 Openquery 中的丹麦字符 (Æ Ø Å) 保留到链接服务器