Выполнить сохраненный процесс с OPENQUERY - PullRequest
5 голосов
/ 12 ноября 2010

У меня SQL Server 2008 со связанным сервером Sybase, и я пытаюсь выполнить хранимую процедуру на сервере Sybase, используя OPENQUERY. Если у меня есть сохраненный процесс, который не принимает параметры, то все в порядке. Если у меня есть сохраненный процесс с параметрами, это не удается. Я даже попробовал очень простой сохраненный процесс, который только взял int, который все еще потерпел неудачу. Ниже приведен синтаксис, который я использую:

select * from 
OPENQUERY([LINKSERVER],'exec database.user.my_stored_proc ''AT'',''XXXX%'',''1111'',1')

Сообщение 7357, уровень 16, состояние 2, строка 3 Не удалось обработать объект "exec database.user.my_stored_proc 'AT', 'XXXX%', '1111', 1". Поставщик OLE DB «ASEOLEDB» для связанного сервера «LINKSERVER» указывает, что либо у объекта нет столбцов, либо у текущего пользователя нет разрешений на этот объект.

Поскольку процесс будет работать без параметров, я не думаю, что это проблема с разрешениями.

Ответы [ 6 ]

14 голосов
/ 22 августа 2011

Это сработало для меня,

SELECT * FROM OPENQUERY(LOCALSERVER, 'SET FMTONLY OFF EXEC snr.dbo.GetAllSignals @controlRunId = 25, @experimentRunId = 26')

Я создавал временные таблицы, и поэтому мне было отказано в доступе

Вот дополнительная информация http://www.sommarskog.se/share_data.html#OPENQUERY

2 голосов
/ 17 мая 2016

Я создаю sp, который не возвращает никакого значения и не работает. Ваш SP в MySQL должен вернуть значение! например, я делаю это в "MySQL":

CREATE DEFINER=`root`@`localhost` PROCEDURE `MyPro`(IN `Name` VARCHAR(50), IN `Id` INT, OUT `Result` INT)
MODIFIES SQL DATA
BEGIN
DECLARE Result INT;
    SET Result = 0;
INSERT into MyTable (Id,Name)  VALUES(Id,Name);
SELECT Result;

END

То, что «Id» и «Name» является входным параметром, а «Result» - выходным и создайте связанный сервер в SQL SERVER и назовите его так:

select * from openquery
(
    Test,'call mydb.MyPro(''Name'',''16'', @P0);'
)

у меня работает: D

1 голос
/ 07 мая 2019

Попробуйте это,

SELECT * FROM OPENQUERY (имя_связи_сервера, 'SELECT postgres_procedure_name (параметры)');

1 голос
/ 15 ноября 2010

Вы также можете увидеть, работает ли он до запуска exec с помощью SET FMTONLY ON:

OPENQUERY ([LINKSERVER], 'SET FMTONLY ON; exec database.user.my_stored_proc' 'AT' ',' 'XXXX% '', '' 1111 '', 1 ')

Если вы попробуете это, и это сработает, вам, вероятно, следует использовать Google FMTONLY + OPENQUERY, чтобы понять, что это значит.

1 голос
/ 12 ноября 2010

Связанные серверы и OPENQUERY, Gems to MS SQL Server ... которые являются волками в овечьей шкуре.Я нашел следующие решения для работы при работе с параметрами

  1. Если SP - это в основном просто операторы SELECT, переместите его в VIEW и просто передайте операторы SQL через OPENQUERY.

  2. Создайте OPENQUERY как строку и затем используйте execute_sql.

0 голосов
/ 21 мая 2019

У меня возникла очень похожая проблема, но мой SP не принимал никаких параметров.Я попытался поэкспериментировать с изменением запроса, отправленного через открытый запрос, на включение «SET NOCOUNT ON» и «SET FMTONLY OFF», но это не имело никакого значения.

Единственным решением, которое работало для моей хранимой процедуры, было удаление существующей версии и изменение кода на «SET NOCOUNT ON»

. После этого я смог успешно запустить свой сохраненный процесс.через соединение с моим связанным сервером.

...