2016-04-18 17 views
8

として供給されるかどうかを検出する以下のT-SQLコードスニペットを検討:T-SQLストアドプロシージャ - パラメータが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 

結果セットがある:

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

分かるように、 @bは二乗されていません。b/c出力パラメータとして渡されませんでした(パラメータを渡すときは、OUTPUT修飾子なし)。

パラメータが実際にOUTPUTパラメータとして渡されたかどうかを確認するために、ストアドプロシージャの本文(この場合はdbo.SquareNumボディ)内でチェックできる方法があるかどうかを知りたいですか?

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' 

またはデータベース・ツリーのManagement Studioで確認してください:

+0

私はあなたがそれを行うことはできないと思います。 –

+0

私はGiorgiに同意します - 実行時に確認することはできません。それを強制することを心配している場合は、プロシージャーを使用する代わりに新しい値を戻すスカラー関数としてこれを行うことができます。興味深い質問。 –

+1

私は答えはありませんが、好奇心の理由から、なぜあなたはこれをしたいのですか?別の方法で解決できる根本的な問題があるのだろうかと思います。 –

答えて

0

あなたはSYSのビューにクエリによってこれを行うことができます [データベース] - >プログラマ - >ストアドプロシージャ - > [手順]は - >

パラメータ
+6

私は、 'OUTPUT'キーワードがストアドプロシージャ定義を呼び出すコードで使われたのか、ストアドプロシージャ定義で使われたのかをどうやって検出するのでしょうかと思います。 –

0

多分私は間違っていますが、私はそれが可能であるとは考えていません。 OUTPUTはストアド・プロシージャ定義の一部であるため、パラメータがOUTPUTであるかどうかを知る必要があります。動的に設定する方法はありませんので、パラメータが出力されたときにコードで判断するのは無意味だと思います。すでに知っているからです。

動的コードを記述しようとしている場合、Piotr Lasotaの答えは、パラメータが出力されたときに正しい方法を理解するのに役立ちます。

0

すべてのパラメータの名前を取得するには、次のクエリを使用して、出力パラメータ:::

​​
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

表示するには、ストアドプロシージャの本体であるかどうかを確認するために

幹部sp_helptextを " '

関連する問題