2008-10-10 18 views
1

J'ai créé la procédure stockée suivante ..Initialiser une variable avec la sortie d'une procédure stockée dans MS SQL Server

CREATE PROCEDURE [dbo].[UDSPRBHPRIMBUSTYPESTARTUP] 
(
    @CODE CHAR(5) 
    , @DESC VARCHAR(255) OUTPUT 
) 
AS 
DECLARE @SERVERNAME nvarchar(30) 
DECLARE @DBASE nvarchar(30) 
DECLARE @SQL nvarchar(2000) 

SET @SERVERNAME = 
    Convert(nvarchar, 
    (SELECT spData FROM dbSpecificData WHERE spLookup = 'CMSSERVER')) 
SET @DBASE = 
    Convert(nvarchar, 
    (SELECT spData FROM dbSpecificData WHERE spLookup = 'CMSDBNAME')) 

SET @SQL = 
    'SELECT clnt_cat_desc FROM ' + @SERVERNAME + 
    '.' + @DBASE + '.dbo.hbl_clnt_cat WHERE inactive = ''N'' 
    AND clnt_cat_code = ''' + @CODE + '''' 

EXECUTE sp_executeSQL @SQL 

RETURN 

Cette procédure est utilisée dans de nombreuses bases de données différentes et de nombreux serveurs différents et est écrit aussi dynamique SQL pour simplifier la maintenance. La procédure fonctionne également sur un serveur différent de celui indiqué par la procédure.

Je veux utiliser la sortie de cette procédure comme une valeur dans une table ...

DECLARE @clid BIGINT 
DECLARE @fileid BIGINT 
DECLARE @myCode CHAR(5) 
DECLARE @myDesc VARCHAR(255) 
DECLARE @@tempDesc VARCHAR(255) 

SET @clid = 1831400022 
SET @fileid = 2072551358 
SET @myCode = 
    (SELECT _clientPrimBusinessType FROM udbhextclient WHERE clid = @clid) 

SET @myDesc = 
    EXEC UDSPRBHPRIMBUSTYPESTARTUP @CODE = @myCode, @DESC = @@tempDesc OUTPUT 
---------------------------------------------------------------------------- 
SELECT 
    a.clid 
    , b.fileid 
    , c.usrfullname AS ClientPartner 
    , e.usrfullname AS ClientFeeEarner 
    , @myDesc AS ClientPrimaryBusinessType 
FROM 
    dbclient a 
    INNER JOIN 
    dbFile b 
    ON 
    a.clid = b.clid 
    INNER JOIN 
    dbuser c 
    ON 
    a.feeusrid = c.usrid 
    INNER JOIN 
    udbhextclient d 
    ON 
    a.clid = d.clid 
    INNER JOIN 
    dbuser e 
    ON 
    d._ClientFeeEarner = e.usrid 
WHERE 
    a.clid = @clid 
    AND b.fileid = @fileid 

Je sais que c'est la syntaxe incorrecte, mais vous pouvez voir ce que je suis en train de réaliser cela sans recours aux tables temporaires car cela impliquerait une maintenance sur 30 serveurs différents avec 3 à 5 bases de données sur chacun.

Smink - Essayé votre solution et a obtenu les résultats suivants ...

Running Smink's Solution

+2

Wow! Comment prononcez-vous ce nom: UDSPRBHPRIMBUSTYPESTARTUP – jop

+0

Le progiciel a beaucoup de mises à jour. Le processus de mise à jour supprimera tout à moins qu'il suive la convention de dénomination ... UD - Défini par l'utilisateur, SPR - Procédure stockée, BH - Boodle Hatfield (employeur), PRIM - primaire BUS - Affaires TYPE - Type STARTUP - Démarrage Certains ont même une longueur maximale de 15 –

+0

Réponse complétée ci-dessous. Regarde. –

Répondre

7

Changer la ligne:

SET @myDesc = 
    EXEC UDSPRBHPRIMBUSTYPESTARTUP @CODE = @myCode, @DESC = @@tempDesc OUTPUT 

à

EXEC UDSPRBHPRIMBUSTYPESTARTUP @CODE = @myCode, @DESC = @tempDesc OUTPUT 

Et vous avez manqué l'attribution @DESC dans la procédure stockée.

SET @SQL = 
    'SELECT @DESC = clnt_cat_desc FROM ' + @SERVERNAME + 
    '.' + @DBASE + '.dbo.hbl_clnt_cat WHERE inactive = ''N'' 
    AND clnt_cat_code = ''' + @CODE + '''' 

EXECUTE sp_executeSQL @SQL, N'@DESC varchar(255) output', @DESC output 

Vous devriez alors utiliser @tempDesc dans la prochaine sélection:

SELECT 
    a.clid 
    , b.fileid 
    , c.usrfullname AS ClientPartner 
    , e.usrfullname AS ClientFeeEarner 
    , @tempDesc AS ClientPrimaryBusinessType 

également votre procédure stockée permet d'injection SQL autour de:

SET @SQL = 
    'SELECT clnt_cat_desc 
    FROM ' + QUOTENAME(@SERVERNAME) + '.' + QUOTENAME(@DBASE) + '.dbo.hbl_clnt_cat 
    WHERE inactive = ''N'' 
     AND clnt_cat_code = @CODE' 

EXECUTE sp_executeSQL @SQL, N'@CODE CHAR(5)', @CODE 

(Mise à jour:. Problèmes résolus par injection SQL)

+0

Cela retourne le résultat mais ne met pas la valeur dans l'instruction