Возможно ли создать таблично-оцениваемые *методы* в SQL CLR user-defined type?

У меня есть CLR UDT, который очень выиграет от таблично-значных методов, как xml.nodes():

-- nodes() example, for reference:
declare @xml xml = '12510'
select c.value('.','int') as id from @xml.nodes('/id') t (c)

Я хочу что-то подобное для своего UDT:

-- would return tuples (1, 4), (1, 5), (1, 6)....(1, 20)
declare @udt dbo.FancyType = '1.4:20'
select * from @udt.AsTable() t (c)

Есть ли у кого-нибудь опыт в этом? Любая помощь будет очень признательна. Я пробовал несколько способов, но все они оказались неудачными. Я искал документацию и примеры, но ничего не нашел.

Да, я знаю, что могу создавать UDF с табличными значениями, которые принимают мой UDT в качестве параметра, но я скорее надеялся объединить все в один тип, в стиле ОО.

EDIT

Рассел Харт нашел в документации говорится, что методы с табличными значениями не поддерживаются, и исправил мой синтаксис, чтобы выдать ожидаемую ошибку во время выполнения (см. ниже).

В VS2010, после создания нового UDT, я добавил следующее в конце определения struct:

[SqlMethod(FillRowMethodName = "GetTable_FillRow", TableDefinition = "Id INT")]
public IEnumerable GetTable()
{
    ArrayList resultCollection = new ArrayList();
    resultCollection.Add(1);
    resultCollection.Add(2);
    resultCollection.Add(3);
    return resultCollection;
}

public static void GetTable_FillRow(object tableResultObj, out SqlInt32 Id)
{
    Id = (int)tableResultObj;
}

Это успешно собирается и развертывается. Но затем в SSMS мы получаем ошибку времени выполнения, как и ожидалось (если не слово в слово):

-- needed to alias the column in the SELECT clause, rather than after the table alias.
declare @this dbo.tvm_example = ''
select t.[Id] as [ID] from @this.GetTable() as [t]

Msg 2715, Level 16, State 3, Line 2
Column, parameter, or variable #1: Cannot find data type dbo.tvm_example.
Parameter or variable '@this' has an invalid data type.

Итак, похоже, что это все-таки невозможно. И даже если бы это было возможно, это, вероятно, было бы неразумно, учитывая ограничения на изменение объектов CLR в SQL Server.

Тем не менее, если кто-нибудь знает хак, позволяющий обойти это конкретное ограничение, я подниму новую награду.

12
задан Jonathan Leffler 23 November 2015 в 20:55
поделиться