web-dev-qa-db-ja.com

SQL Server関数から複数の値を返す

SQL Serverのユーザー定義関数から複数の値(数値や文字列など)を返すにはどうすればよいですか?

43
Jeremy Stein

テーブル値関数にする

こちらをご覧ください http://technet.Microsoft.com/en-us/library/ms191165.aspx 、例が含まれています

34
devio

もう1つのオプションは、出力パラメーター付きのプロシージャを使用することです。 出力パラメーター付きのストアドプロシージャの使用

16
Rockcoder

Erland Sommarskogには、次の場所にあるSQL Serverでデータを渡すことに関する徹底的な投稿があります。

http://www.sommarskog.se/share_data.html

彼はSQL Server 2000、2005、および2008を扱っていますが、各メソッドの長所と短所については十分に網羅されているため、おそらく詳細に読む必要があります。ただし、詳細を見るために使用できる検索用語を提供するために、記事のハイライト(2015年7月時点で凍結)を以下に示します。

この記事では、2つの関連する質問に取り組んでいます。

  • ストアドプロシージャの結果セットを別のストアドプロシージャで使用するにはどうすればよいですか。また、ストアドプロシージャの結果セットを使用するには
    SELECTステートメントの手順?
  • あるストアドプロシージャから別のストアドプロシージャにパラメータでテーブルデータを渡すにはどうすればよいですか?

OUTPUTパラメーター

  • 一般的には適用されませんが、見落とされることもあります。

テーブル値関数

  • 多くの場合、出力のみに最適な選択ですが、いくつかの制限があります。
  • 例:
    • インライン関数:これを使用して、単一のSELECTを再利用します。
    • 複数ステートメント関数:より複雑なロジックをカプセル化する必要がある場合。

テーブルを使用する

  • 最も一般的なソリューション。入出力シナリオでの私の好みの選択。
  • 例:
    • 一時テーブルの共有:主に1組の発信者/着信者用。
    • プロセスキー付きテーブル:同じ呼び出し先の多くの呼び出し元に最適です。
    • グローバル一時テーブル:プロセスキー付きのバリエーション。

テーブル値パラメーター

  • 必須バージョン:SQL 2008
  • クライアントからデータを渡すときに主に役立ちます。

INSERT-EXEC

  • 一見魅力的ですが、控えめに使用する必要があります。

CLRの使用

  • 必須バージョン:SQL 2005
  • 複雑ですが、INSERT-EXECが機能しない最後の手段として役立ちます。

[〜#〜] openquery [〜#〜]

  • 多くの落とし穴があるトリッキー。がっかり。

XMLの使用

  • 必須バージョン:SQL 2005
  • ちょっと面倒ですが、利点がないわけではありません。

カーソル変数の使用

  • 推奨できません。
9
fordareh

インライン関数のクエリアナライザーテンプレートは次のとおりです。既定では2つの値を返します。

-- =============================================  
-- Create inline function (IF)  
-- =============================================  
IF EXISTS (SELECT *   
   FROM   sysobjects   
   WHERE  name = N'<inline_function_name, sysname, test_function>')  
DROP FUNCTION <inline_function_name, sysname, test_function>  
GO  

CREATE FUNCTION <inline_function_name, sysname, test_function>   
(<@param1, sysname, @p1> <data_type_for_param1, , int>,   
 <@param2, sysname, @p2> <data_type_for_param2, , char>)  
RETURNS TABLE   
AS  
RETURN SELECT   @p1 AS c1,   
        @p2 AS c2  
GO  

-- =============================================  
-- Example to execute function  
-- =============================================  
SELECT *   
FROM <owner, , dbo>.<inline_function_name, sysname, test_function>   
    (<value_for_@param1, , 1>,   
     <value_for_@param2, , 'a'>)  
GO  
8
dkretz

複数の出力パラメーターを持つストアドプロシージャの使用例

ユーザーとしてMr. Brownstoneは、 ストアドプロシージャ を使用できることを提案しました。すべての人が簡単にできるように、最小限の例を作成しました。最初 ストアドプロシージャの作成

Create PROCEDURE MultipleOutParameter
    @Input int,
    @Out1 int OUTPUT, 
    @Out2 int OUTPUT 
AS
BEGIN
    Select @Out1 = @Input + 1
    Select @Out2 = @Input + 2   
    Select 'this returns your normal Select-Statement' as Foo
          , 'amazing is it not?' as Bar

    -- Return can be used to get even more (afaik only int) values 
    Return(@Out1+@Out2+@Input)
END 

ストアドプロシージャの呼び出し

ストアドプロシージャを実行する 値を受け取るには、いくつかの ローカル変数 が必要です。

DECLARE @GetReturnResult int, @GetOut1 int, @GetOut2 int 
EXEC @GetReturnResult = MultipleOutParameter  
    @Input = 1,
    @Out1 = @GetOut1 OUTPUT,
    @Out2 = @GetOut2 OUTPUT

値の内容を表示するには、次のことができます

Select @GetReturnResult as ReturnResult, @GetOut1 as Out_1, @GetOut2 as Out_2 

これが結果になります:

Result of Stored Procedure Call with multiple out parameters

1
surfmuggle