que tienen un UDT CLR que se beneficiaría enormemente de métodos con valores de tabla, ala xml.nodes()
:¿Es posible crear * métodos * con valores de tabla en un CLR SQL de tipo definido por el usuario?
-- nodes() example, for reference:
declare @xml xml = '<id>1</id><id>2</id><id>5</id><id>10</id>'
select c.value('.','int') as id from @xml.nodes('/id') t (c)
quiero algo similar para mi 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)
¿Alguien tiene alguna experiencia w/¿esta? Cualquier ayuda sería muy apreciada. He intentado algunas cosas y todas han fallado. He buscado documentación y ejemplos y no encontré ninguno.
Sí, sé que podría crear UDF con valores de tabla que utilicen mi UDT como parámetro, pero esperaba agrupar todo dentro de un solo tipo, estilo OO.
EDITAR
Russell Hart encontró the documentation states that table-valued methods are not supported, y fijó mi sintaxis para producir el error de ejecución esperado (véase más adelante).
En VS2010, después de crear un nuevo UDT, he añadido esto al final de la definición de estructura:
[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;
}
Esto construye y despliega con éxito. Pero entonces, en SSMS, obtenemos un error de ejecución como se espera (si no palabra por palabra):
-- 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.
Por lo tanto, parece que no es posible después de todo. E incluso si fuera posible, probablemente no sería prudente, dadas las restricciones sobre la modificación de objetos CLR en SQL Server.
Dicho esto, si alguien conoce un truco para eludir esta limitación en particular, voy a recaudar una nueva recompensa en consecuencia.
Gracias Russ, sí que ayuda. –