2009-01-20 5 views
3

Bonjour,Exécution d'une procédure stockée via sp_executesql

Je tente d'exécuter une procédure stockée dans une autre procédure stockée. Le problème est que le nom de la procédure stockée est construit dynamiquement dans la première procédure. Voici un exemple de ce que je suis en train de faire ...

CREATE PROCEDURE SPINSVALUE_12345 
    @guid uniqueidentifier 
AS 
    DECLARE @returnValue bit 
    DECLARE @spToExec NVARCHAR(255) 
    SET @returnValue = 0 
    WHILE (@returnValue=0) 
    BEGIN 
     SET @spToExec = 'SPINSVALUE_' + REPLACE(@guid, '-', '_') 
     ... DO OTHER STUFF ... 
     EXEC sp_executeSQL @spToExec, N'@returnValue BIT OUTPUT', @returnValue OUTPUT 
    END 
END 

Je ne peux pas sembler obtenir le sp_executesql de travailler. Est-il possible d'exécuter une procédure stockée de cette façon et obtenir une valeur du paramètre OUTPUT?

Merci d'avance pour toute aide,

Scott Vercuski

Répondre

3

ne le proc ont une valeur de retour ou d'une valeur de sortie? ici est un exemple

create proc prBlatest 
as 
return 5 
go 


DECLARE @chvTableName VARCHAR(100), 
@intTableCount INT, 
@chvSQL NVARCHAR(100) 

SELECT @chvTableName = 'prBlatest' 
SELECT @chvSQL = N'exec @intTableCount = ' + @chvTableName 

EXEC sp_executesql @chvSQL, N'@intTableCount INT OUTPUT', @intTableCount OUTPUT 

SELECT @intTableCount 
GO 

BTW Je pense que cela est une mauvaise idée d'avoir de nombreux effets aléatoires qui font même chose, peut-être que vous devez factoriser

+0

Malheureusement, la procédure stockée nécessite 2 paramètres. .. une entrée et une sortie ... quand j'ajoute que dans la déclaration ne fonctionne plus –

+0

Je réalise que c'est ancien mais j'ai couru dans ce même problème et je n'ai pas pu trouver beaucoup d'aide via Google. Au cas où quelqu'un d'autre trébucherait sur ce post, voici ce que l'astuce pour moi ... Assurez-vous d'ajouter la liste des paramètres à la chaîne SQL ainsi que l'appel sp_executesql. Donc, au-dessus, vous voulez ajouter '+ '@intTableCount = @ intTableCount'' juste après'' + @ chvTableName'' – cBlaine

0

essayez ceci:

SET @spToExec = 'EXEC SPINSVALUE' + REPLACE(@guid, '-', '_') + ' @returnValue OUT'   
EXEC sp_executeSQL @spToExec, N'@returnValue int OUTPUT', @returnValue OUTPUT 
0

I voudrais ajouter à la réponse de SQLMenace. Sa réponse m'a aidé à avancer dans la bonne direction. Dans le cas où les paramètres sont requis pour la procédure, ils DOIVENT être déclarés dans le paramètre statement.

create proc prBlatest @in int 
as 
return 5 + @in 
go 

DECLARE @chvTableName VARCHAR(100), 
    @intTableCount INT, 
    @chvSQL NVARCHAR(100) 

SELECT @chvTableName = 'prBlatest' 
SELECT @chvSQL = N'exec @intTableCount = ' + @chvTableName + ' @inputParam' 
     --NOTICE the @in parameter is declared in the statement parameter 

EXEC sp_executesql @chvSQL, N'@inputParam int, @intTableCount INT OUTPUT' 
    , @inputParam = 5 
    , @intTableCount = @intTableCount OUTPUT 

SELECT @intTableCount 
GO 

La valeur de 10 est renvoyée dans ce cas.

Les paramètres peuvent être définis en utilisant leur nom (utilise les noms de la liste @params) pour éviter toute confusion lorsqu'ils sont nombreux.

0

Désolé pour le retard: D, le code suivant fonctionne parfaitement (pour N .. paramètres de sortie et d'entrée) s'il vous plaît essayez ceci (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 
0
DECLARE @SQL NVARCHAR(100) 
DECLARE @return_value int 
SET @SQL = '[dbo].[SpData] @id = 1' 
EXECUTE sp_executesql @SQL ,N'@return_value INT OUTPUT', @return_value OUTPUT"