2011-07-12 8 views
74

¿Cómo puedo declarar una variable en una función con valores de tabla?Declarar la variable en la función de valores de tabla

+0

en línea o de múltiples instrucciones? ¿Me gusta * MSDN * los describe? – gbn

+9

@YogeshBhadauirya El problema con la ridícula respuesta de "utilizar un motor de búsqueda" es que * este * es donde apunta el motor de búsqueda. Tipo de una situación de recursión infinita. Lo mejor es eliminar la página o simplemente responder la pregunta. – Volvox

+24

Esta pregunta merece más amor: ser reabierto y aceptada la siguiente respuesta. En realidad * es * una verdadera pregunta. – Askolein

Respuesta

136

Hay dos tipos de funciones con valores de tabla. Una que es solo una declaración seleccionada y otra que puede tener más filas que solo una declaración seleccionada.

Esto no se puede tener una variable:

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

Tienes que hacer esta forma:

create function Func() 
returns @T table(ColName int) 
as 
begin 
    declare @Var int 
    set @Var = 10 
    insert into @T(ColName) values (@Var) 
    return 
end 
+1

Gracias, eso es muy útil –

+13

El primer ejemplo se conoce como una "Función de tabla con valores en línea" que tiene beneficios de rendimiento en comparación con una función de valores de tabla multi-declaración, es decir, el servidor de base de datos * puede * recomponer * la consulta con la ITVF * inlined * en la consulta principal, convirtiéndose básicamente en un 'VIEW' parametrizado, mientras que un MSTVF se comporta más como un procedimiento almacenado opaco (aunque con sus propias ventajas en comparación con sprocs). Las funciones en línea deben preferirse a MSTVF. Si necesita calcular y almacenar valores intermedios (como el resultado de una expresión de función escalar compleja), utilice una subconsulta. – Dai

+0

Probablemente también valga la pena mencionar que si el resultado de lo que está utilizando para poblar la variable que desea establecer es de alguna manera generalizable, entonces podría considerar escribir una función separada para generarlo. Esto le permitiría usar la ITVF descrita por @Dai anteriormente, con todos los beneficios de la misma, al mismo tiempo que inserta 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 transmite uno de sus parámetros a una función auxiliar para ahorrarme el uso del formulario MSTVF. – naughtilus

Cuestiones relacionadas