Führen Sie DB2 iSeries Stored Procedure aus einer SQL 2005 Linked Server
-
11-07-2019 - |
Frage
Ich versuche, ein aus einer verknüpften Datenbank in MS SQL 2005. Die verknüpfte Datenbank ist eine DB2-Datenbank auf einem Server iseries procedured gespeichert ist, auszuführen. Ich bin mit den iSeries IBMDASQL Service-Provider. Ich bin in der Lage, die gespeicherte Prozedur ohne Probleme mit einem einfachen Vbscript und ado abzufragen. Wenn ich versuche, die gleiche gespeicherte Prozedur in Query Analyzer auf dem SQL Server ausgeführt werden, sehe ich nie irgendwelche Ergebnisse. Query Analyzer immer zeigen ‚Befehl ausgeführt‘ und wenn ich die select ausführen * auf der temporären Tabelle, erscheinen keine Werte. Was mache ich falsch????? Dank!
- Code aus Query Analyzer unter -
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
AKTUALISIERT: Hier ist der aktualisierte Code Openquery verwendet ... noch kein Glück: (
DECLARE @TSQL varchar (8000) DEKLARIEREN @emailToAddress VARCHAR (50) DEKLARIEREN @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 + '' ' ''' + ')' '' + ')' drucken @TSQL Exec (@TSQL)
- Ausgabe below-- SELECT * FROM OPENQUERY (MAM400, 'CALL abicqual.VP_GETCCEPGMID (' 'customer.service@company.com' ' '' customer@gmail.com '')') Msg 7357, Ebene 16, Status 2, Zeile 1 Kann das Objekt nicht verarbeiten "CALL abicqual.VP_GETCCEPGMID ('customer.service@company.com‘, 'customer@gmail.com')". Der OLE DB-Provider „IBMDASQL“ für den Verbindungsserver „MAM400“ zeigt an, dass entweder das Objekt keine Spalten oder der aktuelle Benutzer keine Berechtigungen für das Objekt.
Lösung
Es stellte sich heraus, dass es eine Reihe von Problemen mit dem IBMDASQL Anbieter sind, die ich benutzte. Ob Sie es glauben oder nicht, ist es schneller und zuverlässiger den Microsoft OLE DB-Provider für ODBC-Treiber zu verwenden. Nachdem Sie einen neuen Verbindungsserver mit diesem Anbieter zu schaffen, die alle meinen früheren SQL-Versuche gearbeitet richtig. Cheers!
Andere Tipps
Ich bin mit den Microsoft DB2OLEDB-Provider, die als Teil des Feature Packs für SQL 2005 verfügbar ist - April 2006. Es ist auch Teil von Host Integration Services. Es hakt in die AS / 400 mit dem DRDA (Oracle-Stil) Protokoll.
Sie können es separat herunterladen, aber es wird nur auf SQL-Standard, Enterprise oder Entwickler (nicht Express) installiert werden.
Ich finde auch, dass der Aufbau die vollständige Abfrage, die ich auf der DB2 / 400-Box ausgeführt werden soll und dann in einem VARCHAR (MAX) string Einwickeln, die auch die „SELECT * FROM OPENQUERY enthalten (--linkedservername -, - -DB2 / 400-Abfrage mit params--)“und dann die Sp_execute oder EXEC-Befehle liefert die besten Ergebnisse.
Es ist sogar möglich, RPG-Code in DB2 / 400 SQL-Prozeduren einpacken und dann rief (mit params) von dem MS SQL Server und zurück ergebnislos eingestellt als MS SQL-Tabelle.
Versuchen Sie es mit OPENQUERY .
Aufruf Oracle-Prozedur (Funktion) über den Verbindungsserver und erhalten ihr Ergebnis (Rückgabewert) --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
Die Lösung ist Klammern um den Anruf Anweisung hinzuzufügen. Sie werden nach wie vor nicht in der Lage sein, in eine Tabelle, obwohl bei SQL Server Ende zu wählen, wenn Sie Unterstützung für verteilte Transaktionen installiert haben. Ich bin mir nicht sicher, warum es eine Transaktion benötigt, aber es wird nicht funktionieren, es sei denn, Sie haben diese einrichten.
exec ( '{CALL-abicqual.VP_GETCCEPGMID (?,?)}', @EmailToAddress, @emailFromAddress) AT MAM400