2016-04-18 9 views
8

Rozważmy następujący kodu T-SQL fragmentu:T-SQL procedury przechowywanej - wykrywanie, czy parametr jest dostarczany jako wyjście

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 

wynikowa jest:

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

Jak widać @b nie jest podniesiony do kwadratu, b/c nie został przekazany jako parametr wyjściowy (nr OUTPUT kwalifikator podczas przekazywania parametru).

Chciałbym wiedzieć, czy istnieje sposób mogę sprawdzić w ramach procedury przechowywanej body (w tym przypadku dbo.SquareNum), aby sprawdzić, czy parametr rzeczywiście został przekazany jako parametr OUTPUT?

+0

Nie sądzę, że możesz to zrobić. –

+0

Zgadzam się z Giorgi - nie myśl, że możesz to sprawdzić w czasie wykonywania. Jeśli martwisz się o jego egzekwowanie, możesz to zrobić jako funkcję skalarną, która zwraca nową wartość zamiast korzystania z procedury. –

+1

Interesujące pytanie. Nie mam odpowiedzi, ale z ciekawości, dlaczego miałbyś to robić? Zastanawiam się, czy istnieje podstawowy problem, który można rozwiązać w inny sposób. –

Odpowiedz

0

Można to zrobić poprzez zapytania do sys widoków:

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' 

lub sprawdzić w Management Studio w drzewie bazy: [database] -> programowania -> procedur przechowywanych -> [postępowania] -> Parametry

+6

Myślę, że pytanie dotyczy tego, jak wykryć, czy słowo kluczowe "WYJŚCIE" zostało użyte w kodzie wywołującym procedurę przechowywaną, a nie definicji procedury przechowywanej. –

0

Może się mylę, ale nie wierzę, że to możliwe. WYJŚCIE jest częścią definicji procedury składowanej, więc powinieneś wiedzieć, kiedy parametr jest WYJŚCIE. Nie ma sposobu, aby ustawić go dynamicznie, więc myślę, że bezcelowe jest ustalanie za pomocą kodu, gdy parametr jest wyprowadzany lub nie, ponieważ już go znasz.

Jeśli próbujesz napisać kod dynamiczny, odpowiedź Piotra Lasoty powinna skłonić cię do prawidłowego rozpoznania, kiedy parametr to Wyjście.

0

Użyj następującej kwerendy, aby uzyskać nazwy wszystkich parametrów i sprawdzić, czy jest to parametr wyjściowy :::

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

aby procedura przechowywana ciało

Exec polecenia sp_helptext ' "

Powiązane problemy