Выполнить хранимую процедуру DB2 iSeries со Связанного сервера SQL 2005

StackOverflow https://stackoverflow.com/questions/329051

Вопрос

Я пытаюсь выполнить хранимую процедуру из связанной базы данных в 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top