52

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

4

5 に答える 5

41

テーブル値関数に変更します

たとえば、次のリンクを参照してください。

于 2008-11-10T20:19:12.040 に答える
17

別のオプションは、出力パラメータを持つプロシージャを使用することです - 出力パラメータを持つストアド プロシージャの使用

于 2008-11-10T20:22:01.283 に答える
10

インライン関数のクエリ アナライザー テンプレートは次のとおりです。既定では 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  
于 2008-11-10T20:32:03.933 に答える
9

Erland Sommarskog は、SQL Server でのデータの受け渡しに関する詳細な投稿を次の場所にあります。

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

彼は SQL Server 2000、2005、および 2008 について説明しています。それぞれの方法の長所と短所が十分に説明されているため、詳細をすべて読む必要があります。ただし、詳細を調べるために使用できる検索用語を提供するために、記事のハイライトを以下に示します (2015 年 7 月時点で凍結されています)。

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

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

出力パラメーター

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

テーブル値関数

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

テーブルの使用

  • 最も一般的なソリューション。入力/出力シナリオの私のお気に入りの選択。
  • 例:
    • 一時テーブルの共有: 主に呼び出し元/呼び出し先の単一のペア用。
    • プロセス キー テーブル: 同じ呼び出し先に対する多くの呼び出し元に最適です。
    • グローバル一時テーブル: プロセスキーのバリエーション。

テーブル値パラメーター

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

挿入-EXEC

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

CLR の使用

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

OPENQUERY

  • 多くの落とし穴でトリッキー。落胆した。

XML の使用

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

カーソル変数の使用

  • お勧めできません。
于 2012-01-27T00:25:51.320 に答える