2012-05-03 17 views
16

¿Cuál es la sintaxis correcta para crear una función escalar en línea en SQL Server?Funciones escalares en línea: ¿real o vaporware?

Libros en pantalla, en el Types of Functions capítulo (2005 en adelante), habla de Inline Funciones escalares como si existieran y como si no se requiere un bloque de BEGIN...END (en contraste con las funciones de varias líneas):

Para una función escalar en línea, no hay cuerpo de función; el valor escalar es el resultado de una declaración única. Para una función escalar de múltiples instrucciones, el cuerpo de la función, definido en un bloque BEGIN ... END, contiene una serie de instrucciones de Transact-SQL que devuelven el valor único.

También he notado una fila para "es: Función escalar en línea" en la lista de tipos de objetos en la tabla spt_values:

SELECT name 
FROM master..spt_values 
WHERE type = 'O9T' 
AND name LIKE '%function%' 

He tratado de crear una función de este tipo sin éxito :

CREATE FUNCTION AddOne(@n int) RETURNS int 
AS 
    RETURN @n + 1 

El mensaje de error es

Msg 102, nivel 15, estado 31, procedimiento AddOne, línea 3 Sintaxis incorrecta cerca de 'RETORNO'.

¿Echo de menos algo o hay un error en Books Online?

+0

No veo cómo BOL para CREATE FUNCTION ni el enlace al que hace referencia implica que no necesita bloques BEGIN..END. Creo que estás malinterpretando algo. –

+0

Para aclarar, me gustaría crear una función de tipo 'IS' y no 'FN' o 'TF'. –

+0

Y qué significa "Para una función escalar en línea, no hay cuerpo de función"? –

Respuesta

8

Bueno, AFAIK, ninguno existe (ni siquiera en la base de datos oculta [mssqlsystemresource]) y no hay sintaxis para crear uno. Así que parece que esto es algo que Microsoft debe haber anticipado en el período previo a SQL Server 2005 al agregarle un tipo (y doc!), Pero en realidad nunca se implementó por algún motivo.

Aunque es una de las funciones más solicitadas para todo el servidor de Sql. Principalmente porque las UDF predeterminadas son muy lentas y terminamos teniendo ITVF de back-end para obtener el mismo efecto. (difícil y torpe, pero funciona).

+2

Parece que están casi aquí http://www.vldb.org/pvldb/vol11/p432-ramachandra. pdf –

+1

@MartinSmith ¡GUAU! ¿Entonces decidieron arreglar * todas las funciones escalares en lugar de solo implementar funciones escalares en línea? Debo admitir que suena increíble, pero aún parece que nos podrían haber dado la opción inline como una opción intermedia barata y fácil. – RBarryYoung

1

Estoy viendo lo mismo. Esa frase parece ser la única referencia a "funciones escalares en línea". This article afirma que las funciones en línea con valores de tabla pueden ser lo suficientemente rápidas para hacer el trabajo.

1

Correcto, no existe la función escalar en línea. Uno puede ser "simulado" usando un TVF en línea, sin embargo, la sintaxis de cualquier "cliente" deberá cambiar. 1) crear la función que:

create function dbo.AddOne(@input int) returns table as return (select @input + 1 as value); 

2) en el código "cliente", de este modo ...

(select value from dbo.AddOne(Column)) as ColumnPlusOne 

Una Ahora usted tiene una función escalar funcionamiento en línea.

que he tenido que hacer esto para reemplazar una gran cantidad de UDF escalares en mi código de cliente que se veía así ...

create function dbo.GetLookupID(@code varchar(50)) returns int 
as 
begin 
    declare @return int; 
    select @return = LookupID from dbo.Lookups where Code = @code; 
    return @return; 
end; 

me trató fijándolo mediante la eliminación de la variable ...

create function dbo.GetLookupID(@code varchar(50)) returns int 
as 
begin 
    return (select LookupID from dbo.Lookups where Code = @code); 
end; 

Eso fue una mejora, sin embargo, todavía había un impacto en el rendimiento desagradable. Cuando cambié al iTVF y cambié la convención de llamadas ... se puso mucho mejor.

Cuestiones relacionadas