Declarar variable en función de tabla valorada


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.