2016-04-18 14 views
8
geliefert wird

Betrachten Sie den folgenden T-SQL-Code-Schnipsel:T-SQL Stored Procedure - Erkennen, wenn ein Parameter als OUTPUT

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 

Die Ergebnismenge ist:

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

Wie man sehen kann, @b ist nicht quadriert, b/c wurde nicht als Ausgangsparameter übergeben (kein OUTPUT Qualifier bei der Übergabe des Parameters).

Ich würde gerne wissen, ob es einen Weg gibt, ich könnte innerhalb der gespeicherten Prozedur Körper überprüfen (dbo.SquareNum Körper in diesem Fall) zu sehen, ob ein Parameter tatsächlich als OUTPUT Parameter übergeben wurde?

+0

Ich glaube nicht, dass Sie das tun können. –

+0

Ich stimme Giorgi zu - glaube nicht, dass du das zur Laufzeit überprüfen kannst. Wenn Sie Bedenken haben, es zu erzwingen, können Sie dies als Skalarfunktion ausführen, die den neuen Wert zurückgibt, anstatt eine Prozedur zu verwenden. –

+1

Interessante Frage. Ich habe keine Antwort, aber aus Neugier, warum willst du das machen? Ich frage mich, ob es ein zugrunde liegendes Problem gibt, das auf andere Weise gelöst werden könnte. –

Antwort

0

Sie können dies auf sys Ansichten durch Abfrage tun:

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' 

oder überprüfen Sie in Management Studio in Datenbankstruktur: [Datenbank] -> Programmierbarkeit -> Stored Procedures -> [Prozedur] -> Parameter

+6

Ich denke, die Frage ist, wie erkennen, ob das 'OUTPUT' Schlüsselwort im Code verwendet wurde, der die gespeicherte Prozedur aufruft, nicht über die gespeicherte Prozedurdefinition. –

0

Vielleicht irre ich mich, aber ich glaube nicht, dass es möglich ist. OUTPUT ist Teil der Definition der gespeicherten Prozedur, so dass Sie wissen sollten, ob ein Parameter OUTPUT ist oder nicht. Es gibt keine Möglichkeit, es dynamisch zu setzen, also denke ich, es ist sinnlos, nach Code zu bestimmen, wenn ein Parameter ausgegeben wird oder nicht, weil Sie es bereits kennen.

Wenn Sie versuchen, einen dynamischen Code zu schreiben, sollte die Antwort von Piotr Lasota Sie dazu bringen, den richtigen Weg zu erkennen, wenn ein Parameter Output ist.

0

Verwenden Sie die folgende Abfrage den Namen aller Parameter zu erhalten und zu überprüfen, ob es sich um ein Ausgabeparameter ist :::

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

Stored Procedure Körper sehen

exec sp_helptext ' '