У нас есть сторонняя DLL, которая может работать с DataTable исходной информации и генерировать некоторые полезные значения, и мы пытаемся подключить ее через SQLCLR, чтобы ее можно было вызывать как табличную определяемую пользователем функцию в SQL Server 2008.
Принимая концепцию здесь еще на один шаг, я хотел бы запрограммировать табличную функцию CLR, которая работает с таблицей исходных данных. из БД.
Я почти уверен, что понимаю, что должно происходить на стороне T-SQL; но как должна выглядеть сигнатура метода в коде .NET (C#)? Какой будет тип данных параметра для "табличных данных из SQL Server?"
e.g.
/* 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) */
Широта/долгота -> расстояние - это глупый пример, который, конечно, лучше полностью обрабатывать в SQL; но я надеюсь, что это иллюстрирует общее назначение table-in -> table-out через UDF с табличным значением, привязанный к сборке SQLCLR.
Я не уверен, что это возможно; как будет выглядеть сигнатура метода SQLCLRInitMethod в C#?
public class GeoDistance
{
[SqlFunction(FillRowMethodName = "FillRow")]
public static IEnumerable SQLCLRInitMethod(<appropriateType> myInputData)
{
//...
}
public static void FillRow(...)
{
//...
}
}
Если это невозможно, я знаю, что могу использовать SQL-соединение "context connection=true" в коде C# для запросить компонент CLR необходимые данные с учетом соответствующих ключей; но это чувствительно к изменениям в схеме БД. Поэтому я надеюсь, что SQL просто упакует все исходные данные и передаст их функции.
Дополнительный вопрос: если это вообще работает, будет ли он работать с более чем одной входной таблицей?