Question

J'essaie d'exécuter une procédure stockée à partir d'une base de données liée dans MS SQL 2005. La base de données liée est une base de données db2 sur un serveur iseries. J'utilise le fournisseur de service iSeries IBMDASQL. Je suis en mesure d'interroger la procédure stockée sans problèmes en utilisant un simple vbscript et ado. Lorsque j'essaie d'exécuter la même procédure stockée dans l'analyseur de requêtes sur SQL Server, je ne vois aucun résultat. L’analyseur de requêtes indique toujours 'commande exécutée' et lorsque j’exécute le select * sur la table temporaire, aucune valeur n’apparaît. Qu'est-ce que je fais mal????? Merci!

- code de l'analyseur de requête ci-dessous -

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

MISE À JOUR: Voici le code mis à jour pour utiliser openquery ... toujours pas de chance: (

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 = 'SELECT * FROM OPENQUERY (MAM400,' 'CALL abicqual.VP_GETCCEPGMID (' '' '' + @emailToAddress + '' '', '' '' + @emailFromAddress + '' '' '' '+ ')' '' + ')' Imprimer @ TSQL EXEC (@TSQL)

- sortie ci-dessous-- SELECT * FROM OPENQUERY (MAM400, 'CALL abicqual.VP_GETCCEPGMID (' 'customer.service@company.com' ',' 'customer@gmail.com' ')') Msg 7357, niveau 16, état 2, ligne 1 Impossible de traiter l'objet "CALL abicqual.VP_GETCCEPGMID ('customer.service@company.com",' customer@gmail.com ') " Le fournisseur OLE DB "IBMDASQL" pour le serveur lié " MAM400 " indique que l'objet n'a pas de colonne ou que l'utilisateur actuel n'a pas de permissions sur cet objet.

Était-ce utile?

La solution

Il s’avère que le fournisseur IBMDASQL que j’utilisais présentait un certain nombre de problèmes. Croyez-le ou non, il est plus rapide et plus fiable d’utiliser le fournisseur Microsoft OLE DB pour les pilotes ODBC. Après avoir créé un nouveau serveur lié avec ce fournisseur, toutes mes tentatives précédentes de SQL fonctionnaient correctement. À la vôtre!

Autres conseils

J'utilise le fournisseur Microsoft DB2OLEDB, disponible dans le Feature Pack for SQL 2005 - Avril 2006. Il fait également partie de Host Integration Services. Il se connecte à l’AS / 400 à l’aide du protocole DRDA (style Oracle).

Vous pouvez le télécharger séparément mais il ne sera installé que sur une norme SQL, une entreprise ou un développeur (non express).

Je trouve également que la construction de la requête complète que je veux exécuter sur la boîte de dialogue DB2 / 400 est ensuite encapsulée dans une chaîne VARCHAR (MAX) qui inclut également le caractère "SELECT * FROM OPENQUERY (--linkedservername--, --DB2 / 400 requête avec params -) " puis, en utilisant les commandes sp_execute ou EXEC, vous obtiendrez les meilleurs résultats.

Il est même possible d'encapsuler du code RPG dans des procédures SQL DB2 / 400, puis de les appeler (avec des paramètres) à partir de MS SQL Server et de renvoyer tout résultat défini sous forme de table MS SQL.

Essayez d’utiliser OPENQUERY . Ce billet de blog montre un exemple de transmission de variables dans une instruction OPENQUERY.

appelez la procédure Oracle (fonction) via le serveur lié et obtenez son résultat (valeur renvoyée)

--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 solution consiste à ajouter des crochets autour de l'instruction d'appel. Vous ne pourrez toujours pas effectuer de sélection dans une table à la fin de SQL Server, à moins que vous n'ayez installé la prise en charge des transactions distribuées. Je ne sais pas pourquoi il faut une transaction, mais cela ne fonctionnera que si vous avez cette configuration.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top