将表作为参数传递给SQLCLR TV-UDF

Ske*_*lan 10 c# sqlclr user-defined-functions sql-server-2008

我们有一个第三方DLL可以在DataTable上运行源信息并生成一些有用的值,我们试图通过SQLCLR将它连接起来,以便在SQL Server 2008中作为表值UDF进行调用.

将这个概念放在这里,我想编写一个CLR表值函数,它对来自DB的源数据表进行操作.

我很确定我理解在T-SQL方面需要发生什么; 但是,方法签名在.NET(C#)代码中应该是什么样的?"来自SQL Server的表数据?"的参数数据类型是什么?

例如

/* 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) */
Run Code Online (Sandbox Code Playgroud)

lat/lon - > distance是一个愚蠢的例子,当然应该在SQL中更好地处理; 但是我希望它通过绑定到SQLCLR程序集的表值UDF来说明table-in - > table-out的一般意图.

我不确定这是可能的; SQLCLRInitMethod方法签名在C#中会是什么样的?

public class GeoDistance
{
    [SqlFunction(FillRowMethodName = "FillRow")]
    public static IEnumerable SQLCLRInitMethod(<appropriateType> myInputData)
    {
      //...
    }

    public static void FillRow(...)
    {
      //...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果不可能,我知道我可以在C#代码中使用"context connection = true"SQL连接,让CLR组件在给定相关密钥的情况下查询必要的数据 ; 但这对数据库架构的变化很敏感.所以我希望让SQL捆绑所有源数据并将其传递给函数.

奖金问题 - 假设这完全有效,它是否也适用于多个输入表?

Ske*_*lan 9

原来在SQLCLR函数上有一个固定的有效输入列表,由.NET数据类型和SQL数据类型之间的可用映射决定

SQL数据类型"表"被明确调出为没有通过CLR的映射.

因此,不可能将表值数据INTO传递给表值CLR函数作为方法参数.

备择方案

似乎可以通过select ... for xml扭曲获取表格数据以输入SqlXml参数.

我已成功使用SqlConnection conn = new SqlConnection("context connection = true");.NET代码让TVF向DB查询所需的表格数据.