Выполнить хранимую процедуру DB2 iSeries со Связанного сервера SQL 2005
-
11-07-2019 - |
Вопрос
Я пытаюсь выполнить хранимую процедуру из связанной базы данных в MS SQL 2005.Связанная база данных - это база данных db2 на сервере iseries.Я использую поставщика услуг iSeries IBMDASQL.Я могу без проблем запросить хранимую процедуру, используя простой vbscript и ado.Когда я пытаюсь выполнить ту же хранимую процедуру в анализаторе запросов на сервере SQL, я никогда не вижу никаких результатов.Анализатор запросов всегда показывает "команда выполнена", и когда я выполняю команду 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(8000) ОБЪЯВИТЬ переменную @emailToAddress(50) ОБЪЯВИТЬ переменную @emailFromAddress(50) УСТАНОВИТЕ @emailToAddress = 'customer.service@company.com' УСТАНОВИТЕ @emailFromAddress = 'customer@gmail.com' УСТАНОВИТЕ @TSQL = 'ВЫБЕРИТЕ * Из OPENQUERY(MAM400,"ВЫЗОВИТЕ abicqual.VP_GETCCEPGMID(""' + @Адрес электронной почты + ""', ""' + @ Адрес электронной почты с адреса + """ + ')"' + ')' Печать @TSQL EXEC (@TSQL)
--вывод ниже-- ВЫБЕРИТЕ * Из OPENQUERY(MAM400,'ВЫЗВАТЬ abicqual.VP_GETCCEPGMID("customer.service@company.com ", "customer@gmail.com")') Сообщение 7357, уровень 16, состояние 2, строка 1 Не удается обработать объект "ВЫЗОВИТЕ abicqual.VP_GETCCEPGMID('customer.service@company.com', 'customer@gmail.com')".Поставщик OLE DB "IBMDASQL" для связанного сервера "MAM400" указывает, что либо у объекта нет столбцов, либо у текущего пользователя нет разрешений на этот объект.
Решение
Оказывается, существует ряд проблем с поставщиком IBMDASQL, которым я пользовался.Хотите верьте, хотите нет, но быстрее и надежнее использовать Microsoft OLE DB Provider для драйверов ODBC.После создания нового связанного сервера с этим поставщиком все мои предыдущие попытки sql работали должным образом.Ваше здоровье!
Другие советы
Я использую поставщик Microsoft DB2OLEDB, который доступен как часть пакета функций для SQL 2005 - апрель 2006.Это также часть служб интеграции хостов.Он подключается к AS / 400 с использованием протокола DRDA (в стиле Oracle).
Вы можете загрузить его отдельно, но он будет устанавливаться только на SQL standard, enterprise или developer (не express).
Я также обнаружил, что построение полного запроса, который я хочу выполнить в окне DB2 / 400, а затем обертывание его в строку VARCHAR (MAX), которая также включает "SELECT * FROM OPENQUERY (--linkedservername--,--запрос DB2 / 400 с параметрами--)", а затем использование команд sp_execute или EXEC возвращает наилучшие результаты.
Можно даже обернуть RPG-код в SQL-процедуры DB2 / 400, а затем вызвать их (с параметрами) с сервера MS SQL и вернуть любой результирующий набор в виде таблицы MS SQL.
Попробуйте использовать ОТКРЫТЫЙ ЗАПРОС. Эта публикация в блоге показывает пример передачи переменных в оператор OPENQUERY.
вызовите процедуру (функцию) oracle через связанный сервер и получите ее результат (возвращаемое значение)
--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
Решение состоит в том, чтобы добавить квадратные скобки вокруг оператора call .Однако вы по-прежнему не сможете выполнить выбор в таблицу на стороне SQL Server, если у вас не установлена поддержка распределенных транзакций.Я не уверен, зачем ему нужна транзакция, но она не будет работать, если у вас это не настроено.
EXEC ('{ВЫЗОВ abicqual.VP_GETCCEPGMID(?, ?)}', @emailToAddress, @emailFromAddress) В MAM400