Domanda

Sto cercando di eseguire una stored procedure da un database collegato in MS SQL 2005. Il database collegato è un database db2 su un server iseries. Sto utilizzando il fornitore di servizi IBM iSeries IBMDASQL. Sono in grado di interrogare la procedura memorizzata senza problemi utilizzando un semplice vbscript e ado. Quando provo ad eseguire la stessa stored procedure nell'analizzatore di query su SQL Server, non vedo mai alcun risultato. L'analizzatore di query mostra sempre "comando eseguito" e quando eseguo select * sulla tabella temporanea, non vengono visualizzati valori. Che cosa sto facendo di sbagliato????? Grazie!

--code dall'analizzatore di query in basso--

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

AGGIORNAMENTO: Ecco il codice aggiornato per usare openquery ... ancora nessuna fortuna :(

DECLARE @TSQL varchar (8000) DECLARE @emailToAddress varchar (50) DECLARE @emailFromAddress varchar (50) SET @emailToAddress = 'customer.service@company.com' SET @emailFromAddress = 'customer@gmail.com' SET @TSQL = 'SELEZIONA * DA OPENQUERY (MAM400,' 'CALL abicqual.VP_GETCCEPGMID (' '' '' + @emailToAddress + '' '' '', '' '' '+ @emailFromAddress +' '' '' '+ ')' '' + ')' Stampa @TSQL EXEC (@TSQL)

--output sotto-- SELEZIONA * DA OPENQUERY (MAM400, 'CALL abicqual.VP_GETCCEPGMID (' 'customer.service@company.com' ',' 'customer@gmail.com' ')') Messaggio 7357, livello 16, stato 2, riga 1 Impossibile elaborare l'oggetto " CALL abicqual.VP_GETCCEPGMID ('customer.service@company.com ',' customer@gmail.com ') " ;. Il provider OLE DB "IBMDASQL" per server collegati "MAM400" indica che l'oggetto non ha colonne o che l'utente corrente non dispone delle autorizzazioni per quell'oggetto.

È stato utile?

Soluzione

Si scopre che ci sono una serie di problemi con il provider IBMDASQL che stavo usando. Che ci crediate o no, è più veloce e più affidabile utilizzare il provider Microsoft OLE DB per i driver ODBC. Dopo aver creato un nuovo server collegato con questo provider, tutti i miei precedenti tentativi sql hanno funzionato correttamente. Cheers!

Altri suggerimenti

Sto usando il provider Microsoft DB2OLEDB che è disponibile come parte del Feature Pack per SQL 2005 - aprile 2006. Fa anche parte di Host Integration Services. Si collega all'AS / 400 usando il protocollo DRDA (stile Oracle).

Puoi scaricarlo separatamente, ma verrà installato solo su standard SQL, impresa o sviluppatore (non espresso).

Trovo anche che costruendo la query completa che voglio eseguire sulla scatola DB2 / 400 e poi avvolgendola in una stringa VARCHAR (MAX) che includa anche " SELECT * FROM OPENQUERY (--linkedservername--, --DB2 / 400 query con params -) " e quindi usando i comandi sp_execute o EXEC si ottengono i migliori risultati.

È anche possibile racchiudere il codice RPG all'interno delle procedure SQL DB2 / 400 e quindi chiamarli (con parametri) dal server MS SQL e restituire qualsiasi set di risultati come tabella MS SQL.

Prova a utilizzare OPENQUERY . Questo post sul blog mostra un esempio di passaggio di variabili in un'istruzione OPENQUERY.

chiama la procedura oracle (funzione) tramite server collegato e ottieni il suo risultato (valore di ritorno)

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

La soluzione è aggiungere parentesi attorno all'istruzione call. Tuttavia, non sarà ancora possibile selezionare una tabella alla fine di SQL Server, a meno che non sia stato installato il supporto per le transazioni distribuite. Non sono sicuro del motivo per cui ha bisogno di una transazione, ma non funzionerà se non si dispone di questa impostazione.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top