0

Je travaille avec SQL Server 2012 et SSRS. En utilisant this réponse très utile, j'ai un travail de requête paramétré qui tire les données d'un système DB2 à travers openquery. J'aimerais en faire un rapport SSRS. Je ne vois pas comment le faire avec une requête, donc je construit une petite procédure stockée pour envelopper la requête dans, comme ceci:Utilisation de la chaîne d'exécution TSQL intégrée pour générer des paramètres de sortie pour le rapport SSRS

ALTER PROCEDURE dbo.QueryInfoByID 
-- Add the parameters for the stored procedure here 
@inputid varchar(10), 
@outputfield varchar(50) output 
AS 
BEGIN 
    DECLARE @TSQL varchar(8000); 
    SELECT @TSQL = 'SELECT * FROM OPENQUERY(IMG2677,''SELECT outputfield FROM mytable WHERE outputfield = ''''' + @inputid + ''''''')' 
    EXEC (@TSQL) 
END 

Comment puis-je connecter le outputfield intégré dans le @TSQL avec le @outputfield dans la liste des paramètres de sortie du SP? J'ai essayé quelques googling et ne peux pas trouver n'importe quoi qui aborde ceci. Toutes mes excuses si c'est une question de débutant; Je n'ai pas beaucoup fait avec les paramètres de sortie dans les procédures stockées.

Répondre

0

Je crois que vous avez juste besoin de modifier votre requête dynamique pour rendre compte du paramètre.

ALTER PROCEDURE dbo.QueryInfoByID 
-- Add the parameters for the stored procedure here 
@inputid varchar(10), 
@outputfield varchar(50) output 
AS 
BEGIN 
    DECLARE @TSQL varchar(8000); 
    SELECT @TSQL = 'SELECT * FROM OPENQUERY(IMG2677,''SELECT '''' + @outputfield + '''' FROM mytable WHERE '''' + @outputfield + ''''= ''''' + @inputid + ''''''')' 
    EXEC (@TSQL) 
END 
+0

Merci, mais je pense que quelque chose de plus est nécessaire. Après quelques lectures, j'ai réalisé que je ne voulais pas de paramètres de sortie; Je veux un jeu de résultats du SP. Cependant, ce qui précède ne semble pas réellement produire un resultset - quand je l'exécute interactivement cela fonctionne, mais SSRS ne voit pas le resultset donc je ne peux pas assigner les champs. J'ai essayé de déclarer une table @t et de changer la TSQL pour "insérer dans @t select * from ..." suivi d'un "select * from @t" pour générer le resultset mais cela échoue au moment de l'exécution de SSRS avec "Doit déclarer le –

0

Il ne devrait y avoir aucune raison pour laquelle vous ne pouvez pas simplement exécuter la même requête que vous utilisez lorsque vous exécutez l'interactivité. Vous ne devriez même pas avoir besoin d'un proc stocké pour le faire. Toutefois, le compte SSRS peut ne pas avoir les droits d'accès pour exécuter la commande. Je l'ai fait par le passé en créant une nouvelle connexion SQL Server, en accordant les autorisations correctes et en exécutant l'instruction SQL avec ce compte (j'ai commencé à lui donner un accès complet pour prouver qu'il a fonctionné puis supprimé un accès inutile).

Par exemple, j'ai créé un identifiant appelé AceDriverLogin que j'utilise lors de l'accès aux fichiers Excel directement sur le serveur. Puis construisez votre instruction SQL (dans votre cas, vous avez fait cela dans @ TSQL). Ensuite, exécutez l'instruction en utilisant la syntaxe suivante.

EXEC (@TSQL) AS LOGIN= 'AceDriverLogin' 
+0

Il est exécuté avec succès Le problème semble être que SSRS ne peut pas détecter le jeu de résultats qui est formé Si je mets la ligne de code EXEC (@ TSQL) dans une autre procédure stockée et l'exécute interactivement dans SSMS, j'obtiens une sortie de jeu de résultats dans la moitié inférieure de l'écran comme je l'avais prévu.Si je dis à SSRS d'utiliser cette procédure stockée pour générer un rapport, il ne peut pas voir un resultset, comme s'il y avait un " select * from ... "déclaration dans le SP.A la place, il dit" pas de champs "quand j'essaie de choisir un champ de données à afficher –

+0

J'ai une solution de contournement maintenant, mais c'est moche. Si je fais ceci:" SELECT @TSQL = 'tronquer la table ; Insérer dans SELECT * FROM OPENQUERY (... "puis II peut faire" select * from "et j'obtiens un ensemble de résultats que SSRS peut voir.Cependant, cela ne fonctionnerait pas pour un rapport qui a une chance d'être utilisé par deux utilisateurs, mais dans ce cas, il n'y a pas plus d'un utilisateur probable (en informatique), donc ça devrait aller, mais pas quelque chose que je voudrais mettre en production, si quelqu'un sait comment contourner cela, je voudrais quand même entendre Solution. –