Declarar variable en función de tabla valorada

110

¿Cómo puedo declarar una variable en una función con valores de tabla? (como en mi título)

e al cuadrado
fuente
en línea o con varias declaraciones? ¿Como los describe MSDN ?
gbn

Respuestas:

205

Hay dos tipos de funciones con valores de tabla. Una que sea solo una declaración de selección y otra que pueda tener más filas que solo una declaración de selección.

Esto no puede tener una variable:

create function Func() returns table
as
return
select 10 as ColName

Tienes que hacer lo siguiente en su lugar:

create function Func()
returns @T table(ColName int)
as
begin
  declare @Var int
  set @Var = 10
  insert into @T(ColName) values (@Var)
  return
end
Mikael Eriksson
fuente
33
El primer ejemplo se conoce como una "función con valores de tabla en línea" que tiene beneficios de rendimiento en comparación con una función con valores de tabla de declaraciones múltiples, es decir, el servidor de base de datos puede recomponer la consulta con la ITVF en línea en la consulta principal, convirtiéndose esencialmente en una función parametrizada VIEWmientras que un MSTVF se comporta más como un procedimiento almacenado opaco (aunque con sus propias ventajas en comparación con los sprocs). Deben preferirse las funciones en línea sobre MSTVF. Si necesita calcular y almacenar valores intermedios (como el resultado de una expresión de función escalar compleja), utilice una subconsulta.
Dai
1
Probablemente también valga la pena mencionar que si el resultado de lo que esté usando para completar la variable que desea establecer es de alguna manera generalizable, entonces podría considerar escribir una función separada para generarla. Esto le permitiría usar la ITVF descrita por @Dai anteriormente, con todos los beneficios de la misma, mientras sigue insertando un valor generado dinámicamente en su función. Acabo de escribir una función con la ayuda de la solución anterior (¡gracias @MikaelEriksson!) Que pasa uno de sus parámetros a una función auxiliar para evitar que tenga que usar el formulario MSTVF.
naughtilus
1
el mayor costo es insertar para mi función y no sé cómo omitir este costo sin insertar en la variable de tabla y devolver el resultado de la selección
uzay95
@naughtilus sería genial ver un ejemplo de esto. ¿Ha considerado proporcionar otra respuesta junto con su sugerencia?
Jacques