Таблица передачи как параметр к SQLCLR TV-UDF

У нас есть сторонний DLL, который может воздействовать на DataTable информации об источнике и генерировать некоторые полезные значения, и мы пытаемся поднять трубку ее через SQLCLR, чтобы быть вызываемыми как табличный UDF в SQL Server 2008.

Беря понятие здесь один шаг вперед, я хотел бы программировать 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) */

lat/lon-> вещью расстояния является глупый пример, который должен, конечно, быть лучше обработан полностью в SQL; но я надеюсь, что это иллюстрирует общее намерение таблицы - в-> таблица через табличный UDF, связанный с блоком SQLCLR.

Я не уверен, что это возможно; на что сигнатура метода SQLCLRInitMethod была бы похожа в C#?

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

    public static void FillRow(...)
    {
      //...
    }
}

Если это не возможно, я знаю, что могу использовать "контекст connection=true" соединение SQL в рамках кода C#, чтобы иметь запрос компонента CLR для необходимых данных, учитывая соответствующие ключи; но это чувствительно к изменениям в схеме DB. Таким образом, я надеюсь просто иметь SQL, укутываются все исходные данные и передают его функции.

Вопрос о премии - принимающий это работает вообще, он также работал бы больше чем с одной входной таблицей?

10
задан Community 23 May 2017 в 12:16
поделиться

1 ответ

Оказывается, существует фиксированный список допустимых входов для функции SQLCLR, определяемый доступным отображением между . NET и SQL типами данных

SQL тип данных "table" явно называется как не имеющий отображения через CLR.

Следовательно, невозможно передать данные с табличным значением в CLR-функцию с табличным значением в качестве параметров метода.

Альтернативы

Кажется возможным получить табличные данные через select ... for xml, чтобы передать их в SqlXml параметр.

Я успешно использовал SqlConnection conn = new SqlConnection("context connection = true"); в коде .NET, чтобы позволить TVF запросить БД для нужных ему табличных данных.

9
ответ дан 4 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: