【发布时间】:2011-03-01 19:57:21
【问题描述】:
我们有一个第三方 DLL,它可以对源信息的 DataTable 进行操作并生成一些有用的值,我们正在尝试通过 SQLCLR 将其连接起来,以便在 SQL Server 2008 中作为表值 UDF 进行调用。
将here 的概念更进一步,我想编写一个CLR Table-Valued Function 来对来自数据库的源数据表进行操作。
我很确定我了解在 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) */
lat/lon -> distance 是一个愚蠢的例子,当然应该更好地完全在 SQL 中处理;但我希望它通过绑定到 SQLCLR 程序集的表值 UDF 来说明 table-in -> table-out 的一般意图。
我不确定这是否可能; C# 中的 SQLCLRInitMethod 方法签名是什么样的?
public class GeoDistance
{
[SqlFunction(FillRowMethodName = "FillRow")]
public static IEnumerable SQLCLRInitMethod(<appropriateType> myInputData)
{
//...
}
public static void FillRow(...)
{
//...
}
}
如果不可能,我知道我可以在 C# 代码中使用“context connection=true”SQL 连接到have the CLR component query for the necessary data 给定相关键;但这对数据库模式的变化很敏感。所以我希望只是让 SQL 捆绑所有源数据并将其传递给函数。
额外的问题 - 假设这完全有效,它是否也适用于多个输入表?
【问题讨论】:
-
Pass table as parameter into sql server UDF 的可能重复项 - Lukasz Lysik 的回答是您问题的解决方案:您需要使用用户定义的表类型。
-
对,我应该澄清一下这个问题。我特意询问如何实现这个的 CLR 组件。我知道在 T-SQL 方面需要发生什么(或者认为我是 - 正在发布示例 t-SQL 代码以显示我假设这需要在该方面工作,以防万一在那里犯任何错误);但是,C# 中的方法签名应该是什么样的? “来自 SQL Server 的表数据”的方法参数是什么?
-
测试它,允许一个对象并返回它的类型名称:)
-
@Tim:很好的建议,谢谢。我会看看会发生什么。
-
@Tim:没有骰子,但是:当我执行上面的 CREATE FUNCTION GetDistances 语句时,SQL Server 响应错误:'CREATE FUNCTION for "GetDistances" failed because T-SQL and CLR types for parameter “@locations”不匹配' - 明确要求 CLR 函数将输入视为对象不足以满足 SQL 的要求。
标签: c# sql-server-2008 sqlclr user-defined-functions