Проблема вызова хранимой процедуры MySQL (с параметрами) через связанный сервер (SQL Server 2005) с использованием синтаксиса OPENQUERY - PullRequest
3 голосов
/ 08 октября 2009

У меня возникают проблемы при попытке вызвать хранимую процедуру MySQL (5.0.77) с параметрами через связанный сервер (SQL Server 2005) с использованием синтаксиса OPENQUERY.

Хранимая процедура 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.

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

4 голосов
/ 25 февраля 2013

Я попытался исправить это, чтобы настроить «Ad Hoc Distributed Queries», но все еще получала ту же ошибку:

  • «Поставщик OLE DB« MSDASQL »для связанного сервера« MyMySQL »указывает что либо у объекта нет столбцов, либо у текущего пользователя нет есть разрешения на этот объект. "

Я пытаюсь выполнить простой удаленный запрос SELECT для связанной базы данных MySQL. В моем случае запрос, который я пытался, выглядел следующим образом. Обратите внимание на количество используемых линий:

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

Исправлено удаление строки после открывающей одинарной кавычки. Просто, да? Но не очевидно.

Рабочий код, показанный ниже:

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

Надеюсь, это поможет! Rob

4 голосов
/ 03 ноября 2009

Вам необходимо включить « Ad Hoc Distributed Queries » на SQL Server. По умолчанию это не включено по соображениям безопасности. В большинстве случаев ошибки «не имеют разрешения» связаны с этим.

Выполните это на SQL Server и попробуйте еще раз свой код:

EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO

Надеюсь, это поможет.

0 голосов
/ 17 ноября 2015

Я понимаю, что это довольно старый пост, но моя проблема была похожа на проблему Роба в том, что SQL в OPENQUERY не переносит разрывы строк в виде пробелов, как SQL-сервер.

т.е. Выкладываю мой запрос следующим образом:

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

I необходимо , чтобы иметь пробелы, как если бы они были записаны в одну строку (используя _ в качестве видимого пространства для демонстрации):

SELECT
    *
FROM
    OPENQUERY(LINKEDSERVER, '
        SELECT_
            SomeField_
        FROM_
            SomeTable
    ')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...