2016-04-18 12 views
8

consideri il seguente codice T-SQL frammento:T-SQL stored procedure - rilevare se un parametro viene fornito come 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 

Il set di risultati è:

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

Come si può vedere, @b non è quadrato, b/c non è stato passato come parametro di uscita (no OUTPUT qualificatore quando si passa nel parametro).

Vorrei sapere se è possibile verificare all'interno del corpo della procedura memorizzata (corpo dbo.SquareNum in questo caso) per verificare se un parametro è stato effettivamente inoltrato come parametro OUTPUT?

+0

Non penso che tu possa farlo. –

+0

Sono d'accordo con Giorgi - non pensare di poterlo controllare in fase di esecuzione. Se sei preoccupato di applicarlo, potresti voler farlo come una funzione scalare che restituisce il nuovo valore invece di usare una procedura. –

+1

Interessante domanda. Non ho una risposta, ma per curiosità, perché vorresti farlo? Mi chiedo se c'è un problema di base che potrebbe essere risolto in un altro modo. –

risposta

0

È possibile effettuare questa operazione query vista 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' 

o il check-in Management Studio nella struttura del database: [database] -> programmabilità -> stored procedure -> [Procedura] -> Parametri

+6

Penso che la domanda riguardi come rilevare se la parola chiave "OUTPUT" è stata utilizzata nel codice che chiama la procedura memorizzata, non nella definizione della stored procedure. –

0

Forse mi sbaglio ma non credo sia possibile. OUTPUT fa parte della definizione della stored procedure, quindi è necessario sapere quando un parametro è o meno OUTPUT. Non c'è modo di impostarlo in modo dinamico quindi penso che sia inutile determinare per codice quando un parametro viene emesso o meno perché lo conosci già.

Se si sta tentando di scrivere un codice dinamico, la risposta di Piotr Lasota dovrebbe guidarvi nel modo corretto per realizzare quando un parametro è Output.

0

utilizzare la seguente query per ottenere il nome di tutti i parametri e controllare se è un parametro di output :::

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

per visualizzare procedura immagazzinata corpo

exec sp_helptext ' '

Problemi correlati