テーブル値関数構文を使用せずに複数の値を返すSQL ServerのCLRユーザー定義関数を作成する方法はありますか?たとえば、次のような座標変換を実行したいとします。Outパラメーターを使用したSQL Server CLR UDF - これは可能ですか?
[SqlFunction()]
public void ConvertCoordinates(SqlDouble x, SqlDouble y, SqlDouble z, out SqlDouble r, out SqlDouble t, out SqlDouble p)
{
r = new SqlDouble(Math.Sqrt((x.Value*x.Value)+(y.Value*y.Value)+(z.Value*z.Value)));
t = new SqlDouble(Math.Acos(r.Value/z.Value));
p = new SqlDouble(Math.Atan(y.Value/x.Value));
}
これも可能ですか?計算では複数の出力行が生成されないため、この場合のテーブル値関数は不適切です。スカラー値の関数構文を使用して、私は計算を実行し、それぞれを別々に呼び出すために3つの異なる関数を書く必要があります。私の実際のユースケースを考えると、これは非常に実用的ではありません。
私は、上記のロジックは純粋なT-SQLを使用して達成できることを認識しています。私の実際のユースケースはより複雑ですが、依然として複数の相互依存する出力値を持つ単一の行だけになります。
だから、結論は実現可能ですか?私はそうは思わないが、誰かが望むことができる。偶然に実現可能なら、そのような関数を呼び出すT-SQLの外観はどうでしょうか?すでにCLRプランジを撮影したので、私はそれを試していないが、私はT-SQLを希望想像認める
UDF(スカラー型、表型、T-SQL型、CLR型)は、パラメータを持つことができません。可能であれば、これらの出力を消費したい場合は、 'SELECT'節で呼び出すための新しい構文を作成する必要があります。そして、私はなぜあなたが奇妙に見えるはずのテーブル値の関数が単一の行を返すのか分かりません。 –
@Damienこれは単にそれが可能かどうかの問題でした。私の読書と実験では、それはおそらく(私も述べたように)そうではないことが示されていましたが、私はCLRの統合を初めて知りましたので、私は尋ねたいと思っていました。 1行以上の可能性がある場合、TVFは「私にとって奇妙な」とは思われません。この例では、常に1行を返しますが、関連する戻り値はセットとしてのみ意味があります。私の実際のユースケースでは、何百万もの行に対して同様の、しかしより大きな計算を実行しています。したがって、パラメータが可能である場合、TVFは非効率的に見えます。シンプルな「いいえ」で十分でした。 – bporter
@bporter - 明らかに、TVFが最善の選択肢になるでしょう - あなたはそれを自分で言うのです。彼らは "1行以上の可能性があるときは奇妙に見えません"と言い、何百万行もあると言います。 Ergo a(S)TVFが答えです!それは、命令的なforeachステートメントのように、すべての行を反復処理するより効率的になるでしょう。 – gbjbaanb