ソース情報のDataTableを操作していくつかの有用な値を生成できるサードパーティのDLLがあり、SQLServer2008でテーブル値のUDFとして呼び出せるようにSQLCLRを介して接続しようとしています。
ここでの概念をさらに一歩進めて、DBからのソースデータのテーブルを操作するCLRテーブル値関数をプログラムしたいと思います。
T-SQL側で何が必要かを理解していると確信しています。しかし、メソッドシグネチャは.NET(C#)コードではどのように見えるべきでしょうか?「SQLServerからのテーブルデータ」のパラメータデータ型は何でしょうか。
例えば
/* Setup */
CREATE TYPE InTableType
AS TABLE (LocationName VARCHAR(50), Lat FLOAT, Lon FLOAT)
GO
CREATE TYPE OutTableType
AS TABLE (LocationName VARCHAR(50), NeighborName VARCHAR(50), Distance FLOAT)
GO
CREATE ASSEMBLY myCLRAssembly
FROM 'D:\assemblies\myCLR_UDFs.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS
GO
CREATE FUNCTION GetDistances(@locations InTableType)
RETURNS OutTableType
AS
EXTERNAL NAME myCLRAssembly.GeoDistance.SQLCLRInitMethod
GO
/* Execution */
DECLARE @myTable InTableType
INSERT INTO @myTable(LocationName, Lat, Lon) VALUES('aaa', -50.0, -20.0)
INSERT INTO @myTable(LocationName, Lat, Lon) VALUES('bbb', -20.0, -50.0)
SELECT * FROM @myTable
DECLARE @myResult OutTableType
INSERT INTO @myResult
GetDistances @myTable /* SQLCLR Call: GeoDistance.SQLCLRInitMethod(@myTable) */
lat / lon-> distanceはばかげた例であり、もちろんSQLで完全に処理する方がよいでしょう。しかし、SQLCLRアセンブリに関連付けられたテーブル値UDFを介したテーブルイン->テーブルアウトの一般的な意図を示していることを願っています。
これが可能かどうかはわかりません。SQLCLRInitMethodメソッドのシグネチャはC#ではどのようになりますか?
public class GeoDistance
{
[SqlFunction(FillRowMethodName = "FillRow")]
public static IEnumerable SQLCLRInitMethod(<appropriateType> myInputData)
{
//...
}
public static void FillRow(...)
{
//...
}
}
それが不可能な場合は、C#コード内で「contextconnection = true」SQL接続を使用して、関連するキーを指定して必要なデータをCLRコンポーネントにクエリさせることができます。ただし、これはDBスキーマの変更に敏感です。したがって、SQLにすべてのソースデータをバンドルさせて、それを関数に渡すことを望んでいます。
ボーナスの質問-これがまったく機能すると仮定すると、複数の入力テーブルでも機能しますか?