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