Выполнить хранимую процедуру DB2 iSeries на связанном сервере SQL 2005 - PullRequest
2 голосов
/ 30 ноября 2008

Я пытаюсь выполнить хранимую процедуру из связанной базы данных в MS SQL 2005. Связанная база данных - это база данных db2 на сервере iseries. Я пользуюсь сервис-провайдером iSeries IBMDASQL. Я могу запросить хранимую процедуру без проблем, используя простой VBScript и ADO. Когда я пытаюсь выполнить ту же хранимую процедуру в анализаторе запросов на SQL Server, я никогда не вижу результатов. Анализатор запросов всегда показывает «команда выполнена», и когда я выполняю команду select * в таблице temp, значения не отображаются. Что я делаю неправильно????? Спасибо!

- код из анализатора запросов ниже -

DECLARE @emailToAddress         char(50)
DECLARE @emailFromAddress       char(50)

set @emailToAddress = 'customer.service@company.com'
set @emailFromAddress = 'customer@gmail.com'

If Object_ID('tempdb..#tmpResultTbl') Is Not Null
    Drop Table #tmpResultTbl

Create Table #tmpResultTbl
(
OUTPGMID Char(150))

--SET FMTONLY Off
Set NoCount On
Insert Into #tmpResultTbl 
EXEC ('CALL abicqual.VP_GETCCEPGMID(?, ?) ', @emailToAddress, @emailFromAddress) AT MAM400 

Select * From #tmpResultTbl

ОБНОВЛЕНИЕ: Вот обновленный код для использования openquery ... все еще не повезло: (

ОБЪЯВИТЬ @TSQL varchar (8000) ОБЪЯВИТЬ @emailToAddress varchar (50) ОБЪЯВИТЬ @emailFromAddress varchar (50) SET @emailToAddress = 'customer.service@company.com' SET @emailFromAddress = 'customer@gmail.com' SET @TSQL = 'SELECT * FROM OPENQUERY (MAM400,' 'CALL abicqual.VP_GETCCEPGMID (' '' '' + @emailToAddress + '' '' ',' '' '' + @emailFromAddress + '' '' '' '+ + ')' '' + ')' Распечатать @TSQL EXEC (@TSQL)

- вывод ниже-- SELECT * FROM OPENQUERY (MAM400, 'CALL abicqual.VP_GETCCEPGMID (' 'customer.service@company.com' ',' 'customer@gmail.com' ')') Сообщение 7357, уровень 16, состояние 2, строка 1 Не удается обработать объект "CALL abicqual.VP_GETCCEPGMID ('customer.service@company.com ',' customer@gmail.com ')". Поставщик OLE DB «IBMDASQL» для связанного сервера «MAM400» указывает, что либо у объекта нет столбцов, либо у текущего пользователя нет разрешений на этот объект.

Ответы [ 5 ]

2 голосов
/ 30 ноября 2008

Оказывается, что у поставщика IBMDASQL есть ряд проблем, которые я использовал. Хотите - верьте, хотите - нет, но быстрее и надежнее использовать поставщик Microsoft OLE DB для драйверов ODBC. После создания нового связанного сервера с этим провайдером все мои предыдущие попытки sql работали правильно. Ура!

1 голос
/ 18 августа 2011

Я использую поставщика Microsoft DB2OLEDB, который доступен как часть пакета возможностей для SQL 2005 - апрель 2006 года. Он также является частью Host Integration Services. Он подключается к AS / 400 по протоколу DRDA (стиль Oracle).

Вы можете загрузить его отдельно, но он будет установлен только на стандарт SQL, на предприятии или на разработчика (не экспресс).

Я также обнаружил, что собираю полный запрос, который я хочу выполнить, в окне DB2 / 400, а затем заключаю его в строку VARCHAR (MAX), которая также включает в себя «SELECT * FROM OPENQUERY (--linkedservername -, - -DB2 / 400 запрос с параметрами--) ", а затем использование команд sp_execute или EXEC возвращает лучшие результаты.

Можно даже обернуть код RPG в процедуры DB2 / 400 SQL, а затем вызвать их (с параметрами) из MS SQL Server и вернуть любой набор результатов в виде таблицы MS SQL.

0 голосов
/ 26 июня 2012

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

EXEC ('{CALL abicqual.VP_GETCCEPGMID (?,?)}', @EmailToAddress, @emailFromAddress) AT MAM400

0 голосов
/ 23 сентября 2009

вызов процедуры оракула (функции) через связанный сервер и получение ее результата (возвращаемого значения)

--input parameters p1, p2, p3
declare @SQL nvarchar(1000)
declare @param nvarchar(100)
declare @result varchar(20) -- numbers may cause data type error

-- (...custom actions, i.e. insert to local table)

set @SQL = N'set @result = (select * from openquery(myLinkedServer, ''select OwnerName.Function_Insert(' + cast(@p1 as varchar) + ', ' + cast(@p1 as varchar) + ', ' + cast(@p3 as varchar) + ') from dual''))'
set @param = '@result varchar output'
EXEC sp_executesql @SQL, @param, @result output 

if @result  '0' goto ERROR

-- (...custom actions)

return 1 -- OK

ERROR:
-- (...custom actions, i.e. delete from local table with(rowlock))
return 0 -- KO
0 голосов
/ 30 ноября 2008

Попробуйте использовать OPENQUERY . Эта запись в блоге показывает пример передачи переменных в оператор OPENQUERY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...