2016-04-18 1 views
8

Considérons le code T-SQL suivant extrait:T-SQL procédure stockée - détecter si un paramètre est fourni sous forme de SORTIE

CREATE PROC dbo.SquareNum(@i INT OUTPUT) 
AS 
BEGIN 
    SET @i = @i * @i 
    --SELECT @i 
END 
GO 

DECLARE @a INT = 3, @b INT = 5 
EXEC dbo.SquareNum @a OUTPUT 
EXEC dbo.SquareNum @b 
SELECT @a AS ASQUARE, @b AS BSQUARE 
GO 
DROP PROC dbo.SquareNum 

Le jeu de résultats est:

ASQUARE  BSQUARE 
----------- ----------- 
9   5 

Comme on le voit, @b n'est pas au carré, b/c il n'a pas été transmis comme paramètre de sortie (pas de qualificatif OUTPUT lors du passage dans le paramètre).

Je voudrais savoir s'il y a un moyen que je puisse vérifier dans le corps de procédure stockée (corps dbo.SquareNum dans ce cas) pour voir si un paramètre a en effet été adoptée en tant que paramètre OUTPUT?

+0

Je ne pense pas que vous pouvez faire cela. –

+0

Je suis d'accord avec Giorgi - ne pense pas que vous pouvez vérifier cela au moment de l'exécution. Si vous avez peur de l'appliquer, vous pouvez le faire en tant que fonction scalaire qui renvoie la nouvelle valeur au lieu d'utiliser une procédure. –

+1

Question intéressante. Je n'ai pas de réponse, mais par curiosité, pourquoi voudriez-vous faire cela? Je me demande s'il y a un problème sous-jacent qui pourrait être résolu d'une autre manière. –

Répondre

0

Vous pouvez le faire par requête à vue sys:

select 
    p.name as proc_name, 
    par.name as parameter_name, 
    par.is_output 
from sys.procedures p 
inner join sys.parameters par on par.object_id=p.object_id 
where p.name = 'SquareNum' 

ou s'enregistrer Management Studio dans l'arborescence de la base de données: [base de données] -> programmabilité -> Procédures stockées -> [procédure] -> Paramètres

+6

Je pense que la question est de savoir comment détecter si le mot clé 'OUTPUT' a été utilisé dans le code appelant la procédure stockée, pas sur la définition de la procédure stockée. –

0

Peut-être que je me trompe mais je ne crois pas que ce soit possible. OUTPUT fait partie de la définition de procédure stockée, vous devez donc savoir quand un paramètre est OUTPUT. Il n'y a aucun moyen de le définir dynamiquement, donc je pense qu'il est inutile de déterminer par code quand un paramètre est sorti ou non parce que vous le connaissez déjà.

Si vous essayez d'écrire un code dynamique, la réponse de Piotr Lasota devrait vous conduire à la bonne façon de réaliser quand un paramètre est Sortie.

0

Utilisez la requête suivante pour obtenir le nom de tous les paramètres et de vérifier si elle est un paramètre de sortie :::

select name, is_output from sys.parameters 
1
------ THIS WILL GIVE YOU THE BOTH VALUE IN squared------ 

    CREATE PROC dbo.SquareNum(@i INT OUTPUT) 
    AS 
    BEGIN 
     SET @i = @i * @i 
     --SELECT @i 
    END 
    GO 

    DECLARE @a INT = 3, @b INT = 5 
    EXEC dbo.SquareNum @a OUTPUT 
    EXEC dbo.SquareNum @b OUTPUT 
    SELECT @a AS ASQUARE, @b AS BSQUARE 
    GO 
    DROP PROC dbo.SquareNum 


    -----TO CHECK STORED PROCEDURE BODY----- 

    SELECT OBJECT_NAME(object_id), 
      OBJECT_DEFINITION(object_id) 
    FROM sys.procedures 
    WHERE OBJECT_DEFINITION(object_id) =(SP_NAME) 
-1

pour voir le corps de procédure stockée

exec sp_helptext ' '