2010-11-11 3 views
5

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

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

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

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

+0

вы пытаетесь запустить текст SQL непосредственно на Sybase? – Andomar

+0

Да, это отлично работает на Sybase –

ответ

1

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

  1. Если ИП в основном только ЗЕЬЕСТ, движение же самое в VIEW и просто передать SQL-операторы с помощью OPENQUERY.

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

1

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

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

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

+1

Нет, это не сработало –

12

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

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

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

Вот подробнее http://www.sommarskog.se/share_data.html#OPENQUERY

+0

+1 это тоже работало для меня. Благодаря! Я не использовал временные таблицы, но я делал EXEC (@VariableWithQuery) в удаленном proc, где эта переменная была установлена ​​из инструкции SELECT. Это не сработало, пока я не добавил «SET FMTONLY OFF»; к началу. Однако, если я установил переменную с помощью команды SET, она работала без необходимости SET FMTONLY. Странный. –

+0

Спасибо!Это сработало и для меня !!! :) – Erick

+0

Справедливое предупреждение о том, что есть некоторые потенциально непреднамеренные последствия для этого метода, как описано в этом ответе: https://stackoverflow.com/a/14299989; но это самый простой способ «заставить его работать» и избегать обращения к DTC, что, вероятно, еще хуже, поэтому это ('SET FMTONLY OFF') - это справедливая работа. – NateJ

2

создать зр, которая не возвращать любое значение, и оно не работает. Ваш 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» и «Имя» является входным параметром и «Результат» является параметром выхода и создать связанный сервер в SQL SERVER и назвать его так:

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

Это работает для меня: D