2017-12-02 11 views
0

私は最終的にいくつかのフィールドのSELECTと計算値を必要とするインポートプロセスを作成しています。計算された値の論理はかなり複雑です。SELECTよりもむしろUDFでそれを行う必要があります。多くのパラメータを使用してUDFを呼び出す

問題は、私が考えられてきた何...計算された値が30〜40列の内容によって決定されていることである。

  • 30-40入力パラメータを持つモンスター機能。
  • 選択したデータをループするSPまたはC#アプリを作成します。このオプションは他のものと同じように未来のものではないようです。
  • レコードのコンテンツ全体を単一のパラメータとしてJSONとして渡し、自分のUDF内の適切なフィールドをプルします。私はhereのように選択して列とJSONを結合する必要があります。

もっと良い解決策をお探しですか?私は最後に向かっている。

この状況をさらに悪化させるためには、UDFの実行を予定しているサーバーにデータがないこと、そのサーバーが古い(FOR JSON句をサポートしていない)ことです。しかし、私はOpenQuery()でこの部分を不器用に乗り越えることができます。

答えて

1

複数のパラメータを渡す代わりに、単一のTVP(テーブル値のパラメータ)を渡すことができます。

アプローチ1:

CREATE TYPE MyTableType AS TABLE 
(param1 VARCHAR(50) 
, param2 INT 
, param3 DATE); 

CREATE FUNCTION dbo.my_func(@tvp_params MyTAB) 
RETURNS TABLE 
AS RETURN (
    SELECT ... 
    FROM ... 
    JOIN @tvp_params ... 
); 

アプローチ2:

CREATE TYPE myEAVTableType AS TABLE 
( param_id INT 
    ,param_name VARCHAR(128) 
    ,param_value SQL_VARIANT); 

AND関数の内部PIVOTのいくつかの並べ替えを行います。

関連する問題