¿Existe alguna manera de crear una función CLR definida por el usuario para SQL Server que devuelva múltiples valores sin usar la sintaxis de la función de valores de tabla? Por ejemplo, digamos que desea realizar una conversión de coordenadas, tales como:SQL Server CLR UDF con parámetros de salida: ¿es posible?
[SqlFunction()]
public void ConvertCoordinates(SqlDouble x, SqlDouble y, SqlDouble z, out SqlDouble r, out SqlDouble t, out SqlDouble p)
{
r = new SqlDouble(Math.Sqrt((x.Value*x.Value)+(y.Value*y.Value)+(z.Value*z.Value)));
t = new SqlDouble(Math.Acos(r.Value/z.Value));
p = new SqlDouble(Math.Atan(y.Value/x.Value));
}
Es esto posible? Una función con valores de tabla en este caso parece inapropiada porque el cálculo nunca arrojará más de una fila de salida. Usando la sintaxis de la función de valor escalar, tendría que escribir tres funciones diferentes para realizar el cálculo y llamar cada uno por separado. Dado mi caso de uso real, esto es muy poco práctico.
Me doy cuenta de que la lógica anterior se puede lograr usando T-SQL puro; mi caso de uso real es más complejo, pero aún así solo resultaría en una sola fila con múltiples valores de salida interdependientes.
Entonces, en conclusión, ¿es factible? No creo que sea, pero uno puede esperar. Si por casualidad es factible, ¿cómo se vería el T-SQL que llama a tal función?
Las UDF (ya sean escalares o tabulares, T-SQL o CLR) no pueden tener parámetros de salida. Si pudieran, tendrías que inventar una nueva sintaxis para permitir que se llame a uno en la cláusula 'SELECT', si querías consumir estas salidas. Y no veo por qué una función con valores de tabla que devuelva una sola fila le parezca extraña. –
@Damien Esto era simplemente una cuestión de si es posible o no.Mi propia lectura y experimentación indicaron que probablemente no era (como también dije), pero como soy nuevo en la integración de CLR, quería preguntar. Las TVF no me parecen "extrañas" cuando hay más de una fila disponible. El ejemplo SIEMPRE devuelve una sola fila, pero los valores de retorno interrelacionados solo son significativos como un conjunto. En mi caso de uso real estoy realizando un cálculo similar pero mayor para millones de filas, por lo que un TVF simplemente parece ineficaz si los parámetros fueran una posibilidad. Un simple 'no' hubiera sido suficiente. – bporter
@bporter - obviamente, una TVF sería la mejor opción - usted mismo lo dice, "no parece extraño cuando hay más de 1 fila es una posibilidad" y luego dice que tiene millones de filas. Ergo a (S) TVF es la respuesta! Va a ser mucho más eficiente que iterar sobre cada fila como una declaración imperativa de foreach. – gbjbaanb