2010-10-27 3 views
1

J'ai un SP que j'ai créé pour vérifier les validations et retourner un paramètre OUTPUT de 0 (aucune erreur) ou 1 (erreur). Cependant, je dois exécuter ce SP dans Dynamic SQL car il sera parcouru par une boucle de données différentes. Puis-je tirer la sortie du SP à travers l'EXEC sp_executesql @SQL?Utilisation de paramètres OUTPUT dans SQL dynamique dans des procédures stockées - Possible?

Je ne peux pas poster le code réel, mais je peux donner un exemple ..

DECLARE 
@SQL nVARCHAR(4000), 
@SPName VARCHAR(200), 
@Parm1 VARCHAR(100), 
@Parm2 VARCHAR(100), 
@Parm3 VARCHAR(100), 
@ParmDefinition nVARCHAR(400), 
@Error nVARCHAR(1) 

SELECT 
    @SPName = 'spExample1', 
    @Parm1 = '000000', 
    @Parm2 = '111111', 
    @Parm3 = '@[email protected] OUTPUT', 

SET @SQL = 'EXEC ' + @SPName + ' ' + @Parm1 + ',' + @Parm2 + ',' + @Parm3 + ' 

SET @ParmDefinition = N'@Err2 nVARCHAR(1) OUTPUT' 
EXEC sp_executesql @SQL, @ParmDefinition, @[email protected] OUTPUT 

La variable @SQL finit par être:

EXEC spExample1 000000, 111111, @[email protected] OUTPUT 

^^ Ce qui fonctionne parfaitement par lui-même.

Fondamentalement, j'essaye d'obtenir la SORTIE à travers le code ci-dessus, mais quand il est exécuté Dynamiquement. Est-ce possible ou existe-t-il un autre moyen de le faire?

La façon dont les choses genre de jeu dans la fin semblent être:

EXEC sp_executesql EXEC spExample1 000000, 111111, @[email protected] OUTPUT, @Err2 nVARCHAR(1) OUTPUT, @[email protected] OUTPUT 

Après avoir regardé ce qu'il a l'air ridicule, mais toute aide serait certainement appréciée.

+0

Le concept semble son. Que se passe-t-il lorsque vous l'exécutez? –

+0

La valeur OUTPUT de @Error est NULL, pas un 0 ou un 1. Pourtant, ce sont les deux seules options disponibles dans le SP: spExample1. – iamtheratio

+0

Copie possible de [Comment obtenir le résultat de sp \ _executesql dans une variable?] (Http://stackoverflow.com/questions/803211/how-to-get-sp-executesql-result-into-a-variable) –

Répondre

0

Je n'ai pas testé en profondeur, mais je ne noter les points suivants:

Lors de l'appel des procédures stockées, vous ne pouvez pas mélanger et match des paramètres nommés et non nommés. Ainsi, au lieu de

EXEC sp_executesql @SQL, @ParmDefinition, @[email protected] OUTPUT 

utilisation

EXEC sp_executesql @SQL, @ParmDefinition, @Error OUTPUT 

mais, étant donné que le paramètre de sortie défini pour sp_executesql est @ Err2, il doit être

EXEC sp_executesql @SQL, @ParmDefinition, @Err2 OUTPUT 

Cela devrait fonctionner.

+0

I En fait, je ne pense pas que cela soit possible puisque vous générez un code de procédure stockée qui doit être exécuté par l'intermédiaire de sp_ExecuteSQL afin que vous ne puissiez pas obtenir une OUTPUT d'une OUTPUT. Quoi qu'il en soit, j'ai trouvé un autre travail mais j'apprécie vraiment l'aide. Merci! – iamtheratio

+1

Si vous vous souvenez encore de la réponse, pourriez-vous l'afficher et la marquer comme réponse? – arviman

3

Désolé pour le retard: D, le code suivant fonctionne parfaitement (pour N .. sortie et des paramètres d'entrée) s'il vous plaît essayer (source):

CREATE PROCEDURE Myproc 
@parm varchar(10), 

@parm1OUT varchar(30) OUTPUT, 
@parm2OUT varchar(30) OUTPUT 
AS 
SELECT @parm1OUT='parm 1' + @parm 
SELECT @parm2OUT='parm 2' + @parm 
GO 
DECLARE @SQLString NVARCHAR(500) 
DECLARE @ParmDefinition NVARCHAR(500) 
DECLARE @parmIN VARCHAR(10) 
DECLARE @parmRET1 VARCHAR(30) 
DECLARE @parmRET2 VARCHAR(30) 
SET @parmIN=' returned' 
SET @SQLString=N'EXEC Myproc @parm, 
@parm1OUT OUTPUT, @parm2OUT OUTPUT' 
SET @ParmDefinition=N'@parm varchar(10), 
@parm1OUT varchar(30) OUTPUT, 
@parm2OUT varchar(30) OUTPUT' 

EXECUTE sp_executesql 
@SQLString, 
@ParmDefinition, 
@[email protected], 
@[email protected] OUTPUT,@[email protected] OUTPUT 

SELECT @parmRET1 AS "parameter 1", @parmRET2 AS "parameter 2" 
go 
drop procedure Myproc 
Questions connexes