7

テーブル値関数構文を使用せずに複数の値を返す SQL Server 用の CLR ユーザー定義関数を作成する方法はありますか? たとえば、次のような座標変換を実行したいとします。

[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 はどのようになるでしょうか?

4

3 に答える 3

3

すでにCLRの急落を経験しているので、あらゆる種類のクレイジーなことを実行できる独自のCLRタイプを作成できます。実際の例として、HierarchyIDと同様に、ネイティブ空間タイプはこの方法で実装されます。独自の型を定義したら、関数にそれを返すようにできます。個々のコンポーネントを取得する場合(あなたの場合、radius、theta、およびphiを推測する場合)、そのようなものを返すタイプのメソッドを作成します。

于 2012-09-27T02:46:38.397 に答える
-1

私はそれを試していないことを認めますが、T-SQL が望んでいると思います。

DECLARE @X FLOAT(53),
        @Y FLOAT(53),
        @Z FLOAT(53),
        @R FLOAT(53),
        @T FLOAT(53),
        @P FLOAT(53)

EXEC    ConvertCoordinates
        @X = 0,
        @Y = 0,
        @Z = 0,
        @R = @R OUTPUT,
        @T = @T OUTPUT
        @P = @P OUTPUT
于 2012-09-26T21:23:38.173 に答える