Funciones escalares en línea: ¿real o vaporware?

¿Cuál es la sintaxis correcta para crear un función escalar en línea en SQL Server?

Libros en línea, en el Tipos de funciones capítulo (2005 y posteriores), habla de funciones escalares en línea como si existieran y como si no BEGIN...END se requiere bloque (a diferencia de las funciones multilínea):

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

También noté una fila para "IS: 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 intentado 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

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

¿Me estoy perdiendo algo o hay un error en Books Online?

preguntado el 03 de mayo de 12 a las 15:05

No veo cómo BOL para CREAR FUNCIÓN ni el enlace al que hizo referencia implica que no necesita BEGIN..END bloques. Creo que estás leyendo algo mal. -

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

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

Es interesante notar que esto todavía existe en los documentos de 2012. msdn.microsoft.com/en-us/library/ms177499%28v=sql.110%29.aspx -

La buena gente de Internet Archive lo obtuvo por escrito, aunque dice "Esta documentación es solo para vista previa y está sujeta a cambios en versiones posteriores".: web.archive.org/web/20111223173828/http://msdn.microsoft.com/… -

4 Respuestas

Bueno, AFAIK, ninguno existe (ni siquiera en lo oculto [mssqlsystemresource] base de datos) 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 agregar un tipo para él (¡y doc!), pero nunca lo implementó por alguna razón.

Aunque es una de las características más solicitadas para todos los servidores Ms Sql. Principalmente porque los UDF predeterminados son muy lentos y terminamos teniendo que respaldar los ITVF para obtener el mismo efecto. (difícil y torpe, pero funciona).

contestado el 03 de mayo de 12 a las 15:05

Parece que ya casi están aquí. vldb.org/pvldb/vol11/p432-ramachandra.pdf - Martin Smith

@MartinSmith ¡GUAU! Así que decidieron arreglar todos los funciones escalares en lugar de simplemente implementar funciones escalares en línea? Tengo que admitirlo, suena increíble, pero todavía parece que podrían habernos dado el en línea como una opción provisional barata y fácil. - RBarryYoung

¿Por qué dar una opción provisional cuando la función ya está disponible para probar? Por favor, vea mi respuesta a continuación! :) - Karthik

¡Documentación oficial de MSDN para el nuevo INLINE Scalar UDF'S!: docs.microsoft.com/en-us/sql/relational-databases/… - Sean

Correcto, no existe tal cosa como una 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:

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

2) en el código "cliente", haz esto...

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

Y ahora tiene una función escalar en línea que funciona.

Tuve que hacer esto para reemplazar muchas UDF escalares en mi código de cliente que se veían 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;

Intenté arreglarlo eliminando 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 hubo un impacto desagradable en el rendimiento. Cuando cambié a iTVF y cambié la convención de llamadas.... mejoró mucho.

Respondido el 02 de enero de 18 a las 18:01

A partir de SQL Server 2019 CTP2.1, hay una nueva característica llamada "Inserción de UDF escalar" que puede incorporar automáticamente UDF escalares cuando se cumplen ciertas condiciones previas.

La publicación oficial del blog que presenta la función está aquí: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/11/07/introducing-scalar-udf-inlining/

La documentación detallada que describe la característica está aquí: https://docs.microsoft.com/en-us/sql/relational-databases/user-defined-functions/scalar-udf-inlining?view=azuresqldb-current

Respondido el 05 de diciembre de 18 a las 18:12

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

contestado el 03 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.