Pergunta

Eu estou tentando executar um armazenado procedured a partir de um banco de dados vinculado em MS SQL 2005. O banco de dados vinculado é um banco de dados DB2 em um servidor iSeries. Eu estou usando o provedor de serviços iSeries IBMDASQL. Eu sou capaz de consultar o procedimento armazenado sem problemas usando um VBScript simples e delongas. Quando tento executar o mesmo procedimento armazenado no Query Analyzer no SQL Server, eu nunca vi nenhum resultado. analisador de consulta sempre mostrar 'comando executado' e quando eu executar o select * na tabela temporária, há valores aparecem. O que estou fazendo de errado????? Obrigado!

- código de analisador de consulta abaixo -

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

ATUALIZADO: Aqui está o código atualizado para uso openquery ... ainda sem sorte: (

varchar DECLARE @TSQL (8000) VARCHAR DECLARE @emailToAddress (50) VARCHAR DECLARE @emailFromAddress (50) SET @emailToAddress = 'customer.service@company.com' SET @emailFromAddress = 'customer@gmail.com' SET @TSQL = 'SELECT * FROM OPENQUERY (MAM400,' 'CHAMADA abicqual.VP_GETCCEPGMID (' '' '' + @emailToAddress + '' '' ' '' ''' + @emailFromAddress + '' '' '' + ')' '' + ')' @TSQL impressão EXEC (@TSQL)

- Saída below-- * SELECT FROM OPENQUERY (MAM400, 'Call abicqual.VP_GETCCEPGMID (' 'customer.service@company.com' ' '' customer@gmail.com '')') Msg 7357, nível 16, estado 2, linha 1 Não é possível processar o objeto "CALL abicqual.VP_GETCCEPGMID ('customer.service@company.com', 'customer@gmail.com')". O provedor OLE DB "IBMDASQL" para o servidor vinculado "MAM400" indica que o objeto não tem colunas ou o usuário atual não tem permissões nesse objeto.

Foi útil?

Solução

Acontece que há uma série de problemas com o provedor IBMDASQL que eu estava usando. Acredite ou não, é mais rápido e mais confiável para usar o Microsoft OLE DB para controladores ODBC. Depois de criar um novo servidor vinculado com este provedor, todas as minhas tentativas anteriores sql funcionou corretamente. Felicidades!

Outras dicas

Eu estou usando o provedor Microsoft DB2OLEDB que está disponível como parte do Feature Pack para SQL 2005 - Abril de 2006. É também parte do Host Integration Services. Engancha no AS / 400 usando o protocolo DRDA (Oracle estilo).

Você pode baixá-lo separadamente, mas ela só vai instalar em SQL padrão, empresa ou desenvolvedor (não expresso).

Eu também acho que a construção da consulta completo que eu quero correr na caixa de DB2 / 400 e, em seguida, envolvê-la em um VARCHAR (MAX) corda que também inclui o "SELECT * FROM OPENQUERY (--linkedservername -, - -DB2 / 400 consulta com params--)" e, em seguida, usando o sp_execute ou comandos EXEC retorna os melhores resultados.

É possível até mesmo encerrar código RPG dentro de procedimentos SQL do DB2 / 400 e, em seguida, chamá-los (com parâmetros) do MS SQL Server e retornar qualquer conjunto de resultados como uma tabela MS SQL.

Tente usar OPENQUERY . Este post no blog mostra um exemplo de passar variáveis ??em uma instrução OPENQUERY.

procedimento de chamada Oracle (função) via servidor ligado e obter o seu resultado (valor de retorno)

--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

A solução é adicionar suportes em torno da instrução de chamada. Você ainda não será capaz de selecionar em uma tabela no final SQL Server embora menos que você tenha suporte instalada para transações distribuídas. Eu não sou certo porque ele precisa de uma transação, mas não funcionará a menos que você tem essa configuração.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top