32 votes

Problème de paramètre de sortie SQL Server

Je suis à l'aide de SQL Server 2008 Enterprise. Je suis en train d'apprendre le paramètre de SORTIE de la procédure stockée SQL Server. Par exemple, la procédure stockée sp_add_jobschedule a un paramètre de SORTIE appelé schedule_id.

http://msdn.microsoft.com/en-us/library/ms366342.aspx

Ma confusion est, ressemble à un paramètre de SORTIE pourrait être fourni à une valeur d'entrée et renvoie une valeur, on dirait qu'il a des comportements à la fois d'ENTRÉE et de SORTIE paramètre? Est-il permis de ne pas fournir les valeurs d'ENTRÉE pour le paramètre de SORTIE (pour la faire ressembler à de la pure paramètre de sortie de comportement)?

Désolé de poser cette question stupide, j'ai fait une demi-heure de recherche sur MSDN, mais ne trouvez rien d'utile. :-(

merci d'avance, George

60voto

marc_s Points 321990

La confusion est justifiée dans une certaine mesure, et d'autres SGBD comme Oracle n'ont paramètres de procédure stockée qui peut être de type IN (entrée uniquement), OUT (sortie uniquement), ou INOUT (dans les deux sens - "passage par référence" type de paramètre).

SQL Server est un peu bâclée ici, puisque c'étiquettes le paramètre "SORTIE", mais vraiment, cela signifie "ENTRÉE/SORTIE" - il fondamentalement signifie simplement que la procédure stockée a une chance de retourner une valeur à partir de son appel dans ce paramètre.

Donc oui, même si elle est appelée paramètre "SORTIE", il est vraiment plus d'un paramètre d'ENTRÉE/SORTIE, et ceux qui sont "DANS", "INOUT", "DE", comme dans Oracle n'existent pas dans le Serveur SQL (T-SQL).

Marc

19voto

Sergey Olontsev Points 806

Je peux vous donner l'exemple court sur la façon de créer une procédure stockée avec un paramètre de sortie.

CREATE PROCEDURE test_proc

@intInput int,
@intOutput int OUTPUT

AS
set @intOutput = @intInput + 1 

go

Et à l'appel de cette procédure, et ensuite utiliser le paramètre de sortie de faire comme suit:

declare @intResult int
exec test_proc 3 ,@intResult OUT
select @intResult

Vous voyez, que vous devez déclarer sortie variable en premier. Et après l'exécution d'une procédure stockée, la valeur de sortie sera dans votre variable. Vous pouvez définir n'importe quelle valeur de votre variable de sortie, mais après l'exécution de la procédure stockée, il contiendra exactement ce que la procédure stockée retour (n'importe quelle valeur dans la variable de sortie).

Par exemple:

declare @intResult int
exec test_proc 3 ,@intResult OUT
select @intResult

Il sera de retour 4. Et:

declare @intResult int
set @intResult = 8
exec test_proc 3 ,@intResult OUT
select @intResult

Également de retour 4.

6voto

Matt Points 2318

Oui, vous pouvez utiliser un paramètre de SORTIE pour les deux passant et l'extraction des valeurs (bien que je ne peux pas penser à une bonne raison de le faire à l'instant).

Voici un exemple trivial qui illustre cela:

-- The stored procedure
CREATE PROCEDURE OutParamExample
    @pNum int OUTPUT
AS
BEGIN
    select @pNum
    set @pNum = @pNum + 5
END
GO

-- use a local variable to retrieve your output param value
declare @TheNumber int
set @TheNumber = 10

print @TheNumber
exec OutParamExample @TheNumber OUTPUT
print @TheNumber

Le résultat ressemblera à ceci:

10

-----------
10

(1 row(s) affected)

15

EDIT: OK, je pense que j'ai manqué un "pas" dans le deuxième alinéa, et peuvent ne pas avoir répondu à la question que vous avez demandé. Si vous voulez un strict paramètre de sortie (par exemple, quelque chose comme un code de retour), vous avez certainement n'avez pas à fournir une valeur à la variable locale transmis en tant que paramètre de sortie, mais vous avez encore de déclarer cette variable locale de sorte que vous aurez un moyen d'accéder à la valeur retournée à l'extérieur de la portée de la procédure elle-même.

Par exemple:

declare @LocalNumber int
-- I don't have to assign a value to @LocalNumber to pass it as a parameter
exex OutParamExample @LocalNumber OUTPUT  
-- (assume SP has been altered to assign some reasonable value)

-- but I do have to declare it as a local variable so I can get to
-- the return value after the stored procedure has been called
print @LocalNumber

3voto

shahkalpesh Points 21553

S'ajoutant à ce que les autres ont dit ci-dessus, les paramètres de SORTIE peuvent agir comme ENTRÉE ainsi que la SORTIE. Mais, cela dépend de la procédure stockée à utiliser la valeur passée à elle.

Si les procédures stockées ignore la valeur passée dans le paramètre de SORTIE (qui doivent, en règle générale), la valeur d'ENTRÉE est ignorée de toute façon.

À l'aide de Sergey du code, je peux utiliser la valeur utilisateur est passé par @intOutput (si j'en ai besoin)

create PROCEDURE test_proc

@intInput int,
@intOutput int OUTPUT

AS
set @intOutput = @intOutput + 1 

go

Mais, que de défaites le but de paramètre de SORTIE.
Pour donner un autre point de vue, compilateur c# vous oblige à remplacer le paramètre de sortie de la valeur par affectation (sans utiliser le paramètre de sortie).

par exemple, je ne peux pas le faire en c#. Ici, il agit comme seul paramètre de sortie (j'.e d'ignorer la valeur de l'utilisateur passés à cette fonction)

static void dosomething(out int i)
{
	//i = 0;
	i = i + 1;
}

2voto

Tomalak Points 150423

La question est - pourquoi voulez-vous refuser de fournir des commentaires? Cela n'a aucun sens. Considérez cet exemple simple:

 CREATE PROCEDURE test (@param AS INT OUTPUT) AS
BEGIN
  SET @param = 100
END
GO

DECLARE @i INT
SET @i = 0

EXECUTE test @i OUTPUT
PRINT @i

DROP PROCEDURE test
 

Ceci imprime

 100
 

Voir - comment êtes - vous censé obtenir une valeur si vous ne mettez pas une variable dans la première?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X