CREATE FUNCTION (Transact-SQL)CREATE FUNCTION (Transact-SQL)

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Crea una función definida por el usuario en SQL ServerSQL Server y Base de datos SQL de AzureAzure SQL Database.Creates a user-defined function in SQL ServerSQL Server and Base de datos SQL de AzureAzure SQL Database. Una función definida por el usuario es una rutina de Transact-SQLTransact-SQL o Common Language Runtime (CLR) que acepta parámetros, realiza una acción, como un cálculo complejo, y devuelve el resultado de esa acción como un valor.A user-defined function is a Transact-SQLTransact-SQL or common language runtime (CLR) routine that accepts parameters, performs an action, such as a complex calculation, and returns the result of that action as a value. El valor devuelto puede ser un valor escalar (único) o una tabla.The return value can either be a scalar (single) value or a table. Utilice esta instrucción para crear una rutina reutilizable que se pueda utilizar de estas formas:Use this statement to create a reusable routine that can be used in these ways:

  • En instrucciones Transact-SQLTransact-SQL como SELECTIn Transact-SQLTransact-SQL statements such as SELECT

  • En las aplicaciones que llaman a la funciónIn applications calling the function

  • En la definición de otra función definida por el usuarioIn the definition of another user-defined function

  • Para parametrizar una vista o mejorar la funcionalidad de una vista indizadaTo parameterize a view or improve the functionality of an indexed view

  • Para definir una columna en una tablaTo define a column in a table

  • Para definir una restricción CHECK en una columnaTo define a CHECK constraint on a column

  • Para reemplazar un procedimiento almacenadoTo replace a stored procedure

  • Usar una función insertada como predicado de filtro de la directiva de seguridadUse an inline function as a filter predicate for a security policy

Nota

En este tema se describe la integración de CLR de .NET Framework en SQL ServerSQL Server.The integration of .NET Framework CLR into SQL ServerSQL Server is discussed in this topic. La integración de CLR no se aplica a Base de datos SQL de AzureAzure SQL Database.CLR integration does not apply to Base de datos SQL de AzureAzure SQL Database.

Nota

Para Almacenamiento de datos SQLSQL Data Warehouse, vea CREATE FUNCTION (SQL Data Warehouse).For Almacenamiento de datos SQLSQL Data Warehouse, see CREATE FUNCTION (SQL Data Warehouse).

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- Transact-SQL Scalar Function Syntax  
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type   
    [ = default ] [ READONLY ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]  
-- Transact-SQL Inline Table-Valued Function Syntax   
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
    [ = default ] [ READONLY ] }   
    [ ,...n ]  
  ]  
)  
RETURNS TABLE  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    RETURN [ ( ] select_stmt [ ) ]  
[ ; ]  
  
-- Transact-SQL Multi-Statement Table-Valued Function Syntax  
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
    [ = default ] [READONLY] }   
    [ ,...n ]  
  ]  
)  
RETURNS @return_variable TABLE <table_type_definition>  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN  
    END  
[ ; ]  
  
-- Transact-SQL Function Clauses   
<function_option>::=   
{  
    [ ENCRYPTION ]  
  | [ SCHEMABINDING ]  
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
  | [ EXECUTE_AS_Clause ]  
  | [ INLINE = { ON | OFF }]  
}  
  
<table_type_definition>:: =   
( { <column_definition> <column_constraint>   
  | <computed_column_definition> }   
    [ <table_constraint> ] [ ,...n ]  
)   
<column_definition>::=  
{  
    { column_name data_type }  
    [ [ DEFAULT constant_expression ]   
      [ COLLATE collation_name ] | [ ROWGUIDCOL ]  
    ]  
    | [ IDENTITY [ (seed , increment ) ] ]  
    [ <column_constraint> [ ...n ] ]   
}  
  
<column_constraint>::=   
{  
    [ NULL | NOT NULL ]   
    { PRIMARY KEY | UNIQUE }  
      [ CLUSTERED | NONCLUSTERED ]   
      [ WITH FILLFACTOR = fillfactor   
        | WITH ( < index_option > [ , ...n ] )  
      [ ON { filegroup | "default" } ]  
  | [ CHECK ( logical_expression ) ] [ ,...n ]  
}  
  
<computed_column_definition>::=  
column_name AS computed_column_expression   
  
<table_constraint>::=  
{   
    { PRIMARY KEY | UNIQUE }  
      [ CLUSTERED | NONCLUSTERED ]   
      ( column_name [ ASC | DESC ] [ ,...n ] )  
        [ WITH FILLFACTOR = fillfactor   
        | WITH ( <index_option> [ , ...n ] )  
  | [ CHECK ( logical_expression ) ] [ ,...n ]  
}  
  
<index_option>::=  
{   
    PAD_INDEX = { ON | OFF }   
  | FILLFACTOR = fillfactor   
  | IGNORE_DUP_KEY = { ON | OFF }  
  | STATISTICS_NORECOMPUTE = { ON | OFF }   
  | ALLOW_ROW_LOCKS = { ON | OFF }  
  | ALLOW_PAGE_LOCKS ={ ON | OFF }   
}  
-- CLR Scalar Function Syntax  
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
)  
RETURNS { return_data_type }  
    [ WITH <clr_function_option> [ ,...n ] ]  
    [ AS ] EXTERNAL NAME <method_specifier>  
[ ; ]  
-- CLR Table-Valued Function Syntax  
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
)  
RETURNS TABLE <clr_table_type_definition>   
    [ WITH <clr_function_option> [ ,...n ] ]  
    [ ORDER ( <order_clause> ) ]  
    [ AS ] EXTERNAL NAME <method_specifier>  
[ ; ]  
-- CLR Function Clauses  
<order_clause> ::=   
{  
   <column_name_in_clr_table_type_definition>  
   [ ASC | DESC ]   
} [ ,...n]   
  
<method_specifier>::=  
    assembly_name.class_name.method_name  
  
<clr_function_option>::=  
}  
    [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
  | [ EXECUTE_AS_Clause ]  
}  
  
<clr_table_type_definition>::=   
( { column_name data_type } [ ,...n ] )  
  
-- In-Memory OLTP: Syntax for natively compiled, scalar user-defined function  
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
 ( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type   
    [ NULL | NOT NULL ] [ = default ] [ READONLY ] }   
    [ ,...n ]   
  ]   
)   
RETURNS return_data_type  
     WITH <function_option> [ ,...n ]   
    [ AS ]   
    BEGIN ATOMIC WITH (set_option [ ,... n ])   
        function_body   
        RETURN scalar_expression  
    END  
  
<function_option>::=   
{  
  |  NATIVE_COMPILATION   
  |  SCHEMABINDING   
  | [ EXECUTE_AS_Clause ]   
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]   
}  
  

ArgumentosArguments

OR ALTEROR ALTER
Se aplica a: SQL ServerSQL Server (desde SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database

Modifica condicionalmente la función solo si ya existe.Conditionally alters the function only if it already exists.

Nota

Desde SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU1 hay disponible una sintaxis [OR ALTER] opcional para CLR.Optional [OR ALTER] syntax for CLR is available starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU1.

schema_nameschema_name
Nombre del esquema al que pertenece la función definida por el usuario.Is the name of the schema to which the user-defined function belongs.

function_namefunction_name
Nombre de la función definida por el usuario.Is the name of the user-defined function. Los nombres de funciones deben seguir las reglas de los identificadores y deben ser únicos en la base de datos y para su esquema.Function names must comply with the rules for identifiers and must be unique within the database and to its schema.

Nota

Los paréntesis después del nombre de la función son necesarios, aunque no se especifique un parámetro.Parentheses are required after the function name even if a parameter is not specified.

@parameter_name@parameter_name
Es un parámetro de la función definida por el usuario.Is a parameter in the user-defined function. Es posible declarar uno o varios parámetros.One or more parameters can be declared.

Una función puede tener un máximo de 2.100 parámetros.A function can have a maximum of 2,100 parameters. El usuario debe proporcionar el valor de cada parámetro declarado cuando se ejecuta la función, a menos que se defina un valor predeterminado para el parámetro.The value of each declared parameter must be supplied by the user when the function is executed, unless a default for the parameter is defined.

Especifique un nombre de parámetro con una arroba (@) como primer carácter.Specify a parameter name by using an at sign (@) as the first character. El nombre del parámetro debe cumplir las mismas reglas que los identificadores.The parameter name must comply with the rules for identifiers. Los parámetros son locales para la función; los mismos nombres de parámetro se pueden utilizar en otras funciones.Parameters are local to the function; the same parameter names can be used in other functions. Los parámetros solamente pueden ocupar el lugar de constantes; no se pueden utilizar en lugar de nombres de tablas, nombres de columnas o nombres de otros objetos de base de datos.Parameters can take the place only of constants; they cannot be used instead of table names, column names, or the names of other database objects.

Nota

ANSI_WARNINGS no se respeta al pasar parámetros en un procedimiento almacenado o una función definida por el usuario, ni cuando se declaran y se establecen variables en una instrucción por lotes.ANSI_WARNINGS is not honored when you pass parameters in a stored procedure, user-defined function, or when you declare and set variables in a batch statement. Por ejemplo, si una variable se define como char(3) y después se establece en un valor de más de tres caracteres, los datos se truncan hasta el tamaño definido y la instrucción INSERT o UPDATE se ejecuta correctamente.For example, if a variable is defined as char(3), and then set to a value larger than three characters, the data is truncated to the defined size and the INSERT or UPDATE statement succeeds.

[ type_schema_name.[ type_schema_name. ] parameter_data_type] parameter_data_type
Es el tipo de datos del parámetro y, de forma opcional, el esquema al que pertenece.Is the parameter data type, and optionally the schema to which it belongs. Para las funciones Transact-SQLTransact-SQL, se permiten todos los tipos de datos, incluidos los tipos definidos por el usuario CLR y los tipos de tablas definidos por el usuario, a excepción del tipo de datos timestamp.For Transact-SQLTransact-SQL functions, all data types, including CLR user-defined types and user-defined table types, are allowed except the timestamp data type. Para las funciones CLR, se permiten todos los tipos de datos, incluidos los tipos definidos por el usuario CLR, a excepción de los tipos de datos definidos por el usuario y los tipos de datos text, ntext, image y timestamp.For CLR functions, all data types, including CLR user-defined types, are allowed except text, ntext, image, user-defined table types and timestamp data types. Los tipos de datos no escalares, cursor y table, no se pueden especificar como tipos de datos de parámetro en funciones Transact-SQLTransact-SQL ni en funciones CLR.The nonscalar types, cursor and table, cannot be specified as a parameter data type in either Transact-SQLTransact-SQL or CLR functions.

Si no se especifica type_schema_name, Motor de base de datosDatabase Engine busca scalar_parameter_data_type en este orden:If type_schema_name is not specified, the Motor de base de datosDatabase Engine looks for the scalar_parameter_data_type in the following order:

  • El esquema que contiene los nombres de los tipos de datos del sistema de SQL ServerSQL Server.The schema that contains the names of SQL ServerSQL Server system data types.
  • El esquema predeterminado del usuario actual en la base de datos actual.The default schema of the current user in the current database.
  • El esquema dbo de la base de datos actual.The dbo schema in the current database.

[ =default ][ =default ]
Es un valor predeterminado para el parámetro.Is a default value for the parameter. Si se define un valor default, la función se puede ejecutar sin especificar un valor para ese parámetro.If a default value is defined, the function can be executed without specifying a value for that parameter.

Nota

Se pueden especificar valores predeterminados de parámetros para las funciones CLR, excepto para los tipos de datos varchar(max) y varbinary(max).Default parameter values can be specified for CLR functions except for the varchar(max) and varbinary(max) data types.

Cuando un parámetro de la función tiene un valor predeterminado, se debe especificar la palabra clave DEFAULT al llamar a la función para recuperar el valor predeterminado.When a parameter of the function has a default value, the keyword DEFAULT must be specified when the function is called to retrieve the default value. Este comportamiento es distinto del uso de parámetros con valores predeterminados en los procedimientos almacenados, donde la omisión del parámetro implica especificar el valor predeterminado.This behavior is different from using parameters with default values in stored procedures in which omitting the parameter also implies the default value. Sin embargo, la palabra clave DEFAULT no se requiere cuando se invoca una función escalar mediante la instrucción EXECUTE.However, the DEFAULT keyword is not required when invoking a scalar function by using the EXECUTE statement.

READONLYREADONLY
Indica que el parámetro no se puede actualizar ni modificar en la definición de la función.Indicates that the parameter cannot be updated or modified within the definition of the function. Si el tipo de parámetro es un tipo de tabla definido por el usuario, se debe especificar READONLY.If the parameter type is a user-defined table type, READONLY should be specified.

return_data_typereturn_data_type
Es el valor devuelto de una función escalar definida por el usuario.Is the return value of a scalar user-defined function. Para las funciones Transact-SQLTransact-SQL, se permiten todos los tipos de datos, incluidos los tipos definidos por el usuario CLR, a excepción del tipo de datos timestamp.For Transact-SQLTransact-SQL functions, all data types, including CLR user-defined types, are allowed except the timestamp data type. Para las funciones CLR, se permiten todos los tipos de datos, incluidos los tipos definidos por el usuario CLR, a excepción de los tipos de datos text, ntext, image y timestamp.For CLR functions, all data types, including CLR user-defined types, are allowed except the text, ntext, image, and timestamp data types. Los tipos de datos no escalares, cursor y table, no se pueden especificar como tipos de datos devueltos en funciones Transact-SQLTransact-SQL ni en funciones CLR.The nonscalar types, cursor and table, cannot be specified as a return data type in either Transact-SQLTransact-SQL or CLR functions.

function_bodyfunction_body
Especifica que una serie de instrucciones Transact-SQLTransact-SQL, que juntas no producen ningún efecto secundario (como modificar una tabla), definen el valor de la función.Specifies that a series of Transact-SQLTransact-SQL statements, which together do not produce a side effect such as modifying a table, define the value of the function. function_body solamente se usa en funciones escalares y en funciones con valores de tabla de múltiples instrucciones (MSTVF).function_body is used only in scalar functions and multi-statement table-valued functions (MSTVFs).

En las funciones escalares, function_body es una serie de instrucciones de Transact-SQLTransact-SQL que se evalúan como un valor escalar.In scalar functions, function_body is a series of Transact-SQLTransact-SQL statements that together evaluate to a scalar value.

En las MSTVF, function_body es una serie de instrucciones Transact-SQLTransact-SQL que rellenan una variable devuelta de TABLE.In MSTVFs, function_body is a series of Transact-SQLTransact-SQL statements that populate a TABLE return variable.

scalar_expressionscalar_expression
Especifica el valor escalar que devuelve la función escalar.Specifies the scalar value that the scalar function returns.

TABLETABLE
Especifica que el valor devuelto de la función con valores de tabla (TVF) es una tabla.Specifies that the return value of the table-valued function (TVF) is a table. Solamente se pueden pasar constantes y @local_variables a las TVF.Only constants and @local_variables can be passed to TVFs.

En las TVF insertadas, el valor devuelto de TABLE se define mediante una única instrucción SELECT.In inline TVFs, the TABLE return value is defined through a single SELECT statement. Las funciones insertadas no tienen variables devueltas asociadas.Inline functions do not have associated return variables.

En las MSTVF, @return_variable es una variable de TABLE, que se usa para almacenar y acumular las filas que se deben devolver como valor de la función.In MSTVFs, @return_variable is a TABLE variable, used to store and accumulate the rows that should be returned as the value of the function. @ return_variable solamente se puede especificar para funciones Transact-SQLTransact-SQL, no para funciones CLR.@return_variable can be specified only for Transact-SQLTransact-SQL functions and not for CLR functions.

select_stmtselect_stmt
Es la instrucción SELECT individual que define el valor devuelto de una función insertada con valores de tabla (TVF).Is the single SELECT statement that defines the return value of an inline table-valued function (TVF).

ORDER (<order_clause>) Especifica el orden en que los resultados se devuelven de la función con valores de tabla.ORDER (<order_clause>) Specifies the order in which results are being returned from the table-valued function. Para obtener más información, vea la sección "Usar el criterio de ordenación en funciones CLR con valores de tabla" más adelante en este tema.For more information, see the section, "Using Sort Order in CLR Table-valued Functions", later in this topic.

EXTERNAL NAME <method_specifier> assembly_name.class_name.method_name EXTERNAL NAME <method_specifier> assembly_name.class_name.method_name
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 SP1 hasta SQL Server 2017SQL Server 2017)Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 SP1 through SQL Server 2017SQL Server 2017)

Especifica el ensamblado y el método al que deberá hacer referencia el nombre de la función creada.Specifies the assembly and method to which the created function name shall refer.

  • assembly_name: debe coincidir con un valor en la columna name deassembly_name - must match a value in the name column of
    Columnas en la tabla de origen capturadasSELECT * FROM sys.assemblies;SELECT * FROM sys.assemblies;.
    Este es el nombre que se utilizó en la instrucción CREATE ASSEMBLY.This is the name that was used on the CREATE ASSEMBLY statement.

  • class_name: debe coincidir con un valor en la columna assembly_name declass_name - must match a value in the assembly_name column of
    Columnas en la tabla de origen capturadasSELECT * FROM sys.assembly_modules;SELECT * FROM sys.assembly_modules;.
    A menudo el valor contiene un punto incrustado.Often the value contains an embedded period or dot. En tales casos, la instrucción Transact-SQL sintaxis requiere que el valor se limite con un par de corchetes [] o con un par de comillas dobles "".In such cases the Transact-SQL syntax requires that the value be bounded with a pair of straight brackets [], or with a pair of double quotation marks "".

  • method_name: debe coincidir con un valor en la columna method_name demethod_name - must match a value in the method_name column of
    Columnas en la tabla de origen capturadasSELECT * FROM sys.assembly_modules;SELECT * FROM sys.assembly_modules;.
    El método debe ser estático.The method must be static.

En un ejemplo típico de MyFood.DLL, en el que todos los tipos están en el espacio de nombres MyFood, el valor de EXTERNAL NAME podría ser:In a typical example, for MyFood.DLL, in which all types are in the MyFood namespace, the EXTERNAL NAME value could be:
MyFood.[MyFood.MyClass].MyStaticMethod

Nota

De manera predeterminada, SQL ServerSQL Server no puede ejecutar código CLR.By default, SQL ServerSQL Server cannot execute CLR code. Se pueden crear, modificar y quitar objetos de base de datos que hagan referencia a módulos de Common Language Runtime, pero estas referencias no se pueden ejecutar en SQL ServerSQL Server hasta que se habilite la opción clr enabled.You can create, modify, and drop database objects that reference common language runtime modules; however, you cannot execute these references in SQL ServerSQL Server until you enable the clr enabled option. Para habilitarla, use sp_configure.To enable this option, use sp_configure.

Nota

Esta opción no está disponible en las bases de datos independientes.This option is not available in a contained database.

< table_type_definition > ( { <column_definition> <column_constraint> | <computed_column_definition> } [ <table_constraint> ] [ ,...n ] ) Define el tipo de datos de tabla de una función Transact-SQLTransact-SQL.< table_type_definition*>* ( { <column_definition> <column_constraint> | <computed_column_definition> } [ <table_constraint> ] [ ,...n ] ) Defines the table data type for a Transact-SQLTransact-SQL function. La declaración de tabla incluye definiciones de columna y restricciones de columna o de tabla.The table declaration includes column definitions and column or table constraints. La tabla se coloca siempre en el grupo de archivos principal.The table is always put in the primary filegroup.

< clr_table_type_definition > ( { column_name**data_type } [ ,...n ] )< clr_table_type_definition > ( { column_name**data_type } [ ,...n ] )
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 SP1 hasta SQL Server 2017SQL Server 2017) y Base de datos SQL de AzureAzure SQL Database (versión preliminar en algunas regiones).Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 SP1 through SQL Server 2017SQL Server 2017) and Base de datos SQL de AzureAzure SQL Database (Preview in some regions).

Define los tipos de datos de tabla para una función CLR.Defines the table data types for a CLR function. La declaración de tabla solamente incluye nombres de columna y tipos de datos.The table declaration includes only column names and data types. La tabla se coloca siempre en el grupo de archivos principal.The table is always put in the primary filegroup.

NULL|NOT NULLNULL|NOT NULL
Solo admite funciones escalares definidas por el usuario compiladas de forma nativa.Supported only for natively compiled, scalar user-defined functions. Para obtener más información, vea Funciones escalares definidas por el usuario para OLTP en memoria.For more information, see Scalar User-Defined Functions for In-Memory OLTP.

NATIVE_COMPILATIONNATIVE_COMPILATION
Indica si una función definida por el usuario se compila de forma nativa.Indicates whether a user-defined function is natively compiled. Este argumento es obligatorio en funciones escalares definidas por el usuario compiladas de forma nativa.This argument is required for natively compiled, scalar user-defined functions.

BEGIN ATOMIC WITHBEGIN ATOMIC WITH
Solo admite funciones escalares definidas por el usuario compiladas de forma nativa y es obligatorio.Supported only for natively compiled, scalar user-defined functions, and is required. Para obtener más información, consulte Atomic Blocks.For more information, see Atomic Blocks.

SCHEMABINDINGSCHEMABINDING
El argumento SCHEMABINDING se requiere para las funciones escalares definidas por el usuario compiladas de forma nativa.The SCHEMABINDING argument is required for natively compiled, scalar user-defined functions.

EXECUTE ASEXECUTE AS
EXECUTE AS es obligatorio en funciones escalares definidas por el usuario compiladas de forma nativa.EXECUTE AS is required for natively compiled, scalar user-defined functions.

<function_option>::= y <clr_function_option>::=<function_option>::= and <clr_function_option>::=

Especifica que la función tendrá una o más de las siguientes opciones.Specifies that the function will have one or more of the following options.

ENCRYPTIONENCRYPTION
Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 SP1 hasta SQL Server 2017SQL Server 2017)Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 SP1 through SQL Server 2017SQL Server 2017)

Indica que el Motor de base de datosDatabase Engine convertirá el texto original de la instrucción CREATE FUNCTION a un formato confuso.Indicates that the Motor de base de datosDatabase Engine will convert the original text of the CREATE FUNCTION statement to an obfuscated format. La salida de los datos confusos no es directamente visible en ninguna de las vistas de catálogo.The output of the obfuscation is not directly visible in any catalog views. Los usuarios que no disponen de acceso a las tablas del sistema o a los archivos de base de datos no pueden recuperar el texto protegido.Users that have no access to system tables or database files cannot retrieve the obfuscated text. En cambio, estará disponible para los usuarios con privilegios que puedan obtener acceso a las tablas del sistema a través del puerto DAC o directamente a los archivos de base de datos.However, the text will be available to privileged users that can either access system tables over the DAC port or directly access database files. Además, los usuarios que pueden adjuntar un depurador al proceso del servidor pueden recuperar el procedimiento original de la memoria en tiempo de ejecución.Also, users that can attach a debugger to the server process can retrieve the original procedure from memory at runtime. Para más información sobre cómo tener acceso al sistema, vea Configuración de visibilidad de los metadatos.For more information about accessing system metadata, see Metadata Visibility Configuration.

El uso de esta opción impide que la función se publique como parte de la replicación de SQL ServerSQL Server.Using this option prevents the function from being published as part of SQL ServerSQL Server replication. Esta opción no se puede especificar para funciones CLR.This option cannot be specified for CLR functions.

SCHEMABINDINGSCHEMABINDING
Especifica que la función está enlazada a los objetos de base de datos a los que hace referencia.Specifies that the function is bound to the database objects that it references. Cuando se especifica SCHEMABINDING, los objetos base no se pueden modificar de una forma que afecte a la definición de la función.When SCHEMABINDING is specified, the base objects cannot be modified in a way that would affect the function definition. En primer lugar, se debe modificar o quitar la propia definición de la función para quitar las dependencias en el objeto que se va a modificar.The function definition itself must first be modified or dropped to remove dependencies on the object that is to be modified.

El enlace de la función a los objetos a los que hace referencia solamente se quita cuando se ejecuta una de estas acciones:The binding of the function to the objects it references is removed only when one of the following actions occurs:

  • Se quita la función.The function is dropped.

  • La función se modifica con la instrucción ALTER sin especificar la opción SCHEMABINDING.The function is modified by using the ALTER statement with the SCHEMABINDING option not specified.

Una función se puede enlazar a esquema solamente si se cumplen las siguientes condiciones:A function can be schema bound only if the following conditions are true:

  • La función es una función de Transact-SQLTransact-SQL.The function is a Transact-SQLTransact-SQL function.

  • Las funciones definidas por el usuario y las vistas a las que hace referencia la función también están enlazadas al esquema.The user-defined functions and views referenced by the function are also schema-bound.

  • La función hace referencia a los objetos utilizando un nombre en dos partes.The objects referenced by the function are referenced using a two-part name.

  • La función y los objetos a los que hace referencia pertenecen a la misma base de datos.The function and the objects it references belong to the same database.

  • El usuario que ejecutó la instrucción CREATE FUNCTION tiene permisos REFERENCES para los objetos de base de datos a los que hace referencia la función.The user who executed the CREATE FUNCTION statement has REFERENCES permission on the database objects that the function references.

RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUTRETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT
Especifica el atributo OnNULLCall de una función escalar.Specifies the OnNULLCall attribute of a scalar function. Si no se especifica, se utiliza CALLED ON NULL INPUT de manera predeterminada.If not specified, CALLED ON NULL INPUT is implied by default. Esto significa que el cuerpo de la función se ejecuta aunque se envíe NULL como argumento.This means that the function body executes even if NULL is passed as an argument.

Si se especifica RETURNS NULL ON NULL INPUT en una función CLR, esto indica que SQL ServerSQL Server puede devolver NULL cuando cualquiera de los argumentos que recibe sea NULL, sin invocar realmente el cuerpo de la función.If RETURNS NULL ON NULL INPUT is specified in a CLR function, it indicates that SQL ServerSQL Server can return NULL when any of the arguments it receives is NULL, without actually invoking the body of the function. Si el método de una función CLR especificado en <method_specifier> ya tiene un atributo personalizado que indica RETURNS NULL ON NULL INPUT, pero la instrucción CREATE FUNCTION indica CALLED ON NULL INPUT, la instrucción CREATE FUNCTION tiene prioridad.If the method of a CLR function specified in <method_specifier> already has a custom attribute that indicates RETURNS NULL ON NULL INPUT, but the CREATE FUNCTION statement indicates CALLED ON NULL INPUT, the CREATE FUNCTION statement takes precedence. El atributo OnNULLCall no se puede especificar para las funciones CLR con valores de tabla.The OnNULLCall attribute cannot be specified for CLR table-valued functions.

Cláusula EXECUTE ASEXECUTE AS Clause
Especifica el contexto de seguridad en el que se ejecuta la función definida por el usuario.Specifies the security context under which the user-defined function is executed. Por lo tanto, es posible controlar la cuenta de usuario que usa SQL ServerSQL Server para validar los permisos en los objetos de base de datos a los que hace referencia la función.Therefore, you can control which user account SQL ServerSQL Server uses to validate permissions on any database objects that are referenced by the function.

Nota

EXECUTE AS no se puede especificar para las funciones con valores de tabla insertadas.EXECUTE AS cannot be specified for inline table-valued functions.

Para obtener más información, vea EXECUTE AS (cláusula de Transact-SQL).For more information, see EXECUTE AS Clause (Transact-SQL).

INLINE = { ON | OFF }INLINE = { ON | OFF }
Especifica si esta UDF escalar se debe insertar o no.Specifies whether this scalar UDF should be inlined or not. Esta cláusula solo se aplica a las funciones escalares definidas por el usuario.This clause applies only to scalar user-defined functions. La cláusula INLINE no es obligatoria.The INLINE clause is not mandatory. Si no se especifica la cláusula INLINE, se establece automáticamente en ON/OFF en función de si la UDF es insertable.If INLINE clause is not specified, it is automatically set to ON/OFF based on whether the UDF is inlineable. Si se especifica INLINE=ON pero se detecta que la UDF no es insertable, se producirá un error.If INLINE=ON is specified but the UDF is found to be non-inlineable, an error will be thrown. Para obtener más información, vea Scalar UDF inlining (Inserción de UDF escalar).For more information, see Scalar UDF Inlining.

< column_definition >::=< column_definition >::=

Define el tipo de datos de tabla.Defines the table data type. La declaración de tabla incluye definiciones de columna y restricciones.The table declaration includes column definitions and constraints. En las funciones CLR, solo se pueden especificar column_name y data_type.For CLR functions, only column_name and data_type can be specified.

column_namecolumn_name
Es el nombre de una columna de la tabla.Is the name of a column in the table. Los nombres de columna se deben ajustar a las reglas para los identificadores y deben ser únicos en la tabla.Column names must comply with the rules for identifiers and must be unique in the table. column_name puede tener entre 1 y 128 caracteres.column_name can consist of 1 through 128 characters.

data_typedata_type
Especifica el tipo de datos de la columna.Specifies the column data type. En las funciones Transact-SQLTransact-SQL, se permiten todos los tipos de datos, incluidos los tipos CLR definidos por el usuario, a excepción de timestamp.For Transact-SQLTransact-SQL functions, all data types, including CLR user-defined types, are allowed except timestamp. Para las funciones CLR, se permiten todos los tipos de datos, incluidos los tipos CLR definidos por el usuario, a excepción de text, ntext, image, char, varchar, varchar(max) y timestamp. El tipo no escalar cursor no se puede especificar como tipo de datos de columna en funciones Transact-SQLTransact-SQL o CLR.For CLR functions, all data types, including CLR user-defined types, are allowed except text, ntext, image, char, varchar, varchar(max), and timestamp.The nonscalar type cursor cannot be specified as a column data type in either Transact-SQLTransact-SQL or CLR functions.

DEFAULT constant_expressionDEFAULT constant_expression
Especifica el valor suministrado para la columna cuando no se ha especificado explícitamente un valor durante una inserción.Specifies the value provided for the column when a value is not explicitly supplied during an insert. constant_expression es una constante, un valor NULL o un valor de función del sistema.constant_expression is a constant, NULL, or a system function value. Se pueden aplicar definiciones con el valor DEFAULT a cualquier columna, excepto las que incluyen la propiedad IDENTITY.DEFAULT definitions can be applied to any column except those that have the IDENTITY property. No se puede especificar DEFAULT para las funciones CLR con valores de tabla.DEFAULT cannot be specified for CLR table-valued functions.

COLLATE collation_nameCOLLATE collation_name
Especifica la intercalación de la columna.Specifies the collation for the column. Si no se especifica, se asigna a la columna la intercalación predeterminada de la base de datos.If not specified, the column is assigned the default collation of the database. El nombre de intercalación puede ser un nombre de intercalación de Windows o un nombre de intercalación de SQL.Collation name can be either a Windows collation name or a SQL collation name. Para obtener una lista y más información sobre las intercalaciones, vea Nombre de intercalación de Windows (Transact-SQL) y Nombre de intercalación de SQL Server (Transact-SQL).For a list of and more information about collations, see Windows Collation Name (Transact-SQL) and SQL Server Collation Name (Transact-SQL).

La cláusula COLLATE se puede usar para cambiar únicamente las intercalaciones de las columnas con tipos de datos char, varchar, nchar y nvarchar.The COLLATE clause can be used to change the collations only of columns of the char, varchar, nchar, and nvarchar data types.

Nota

COLLATE no se puede especificar para las funciones CLR con valores de tabla.COLLATE cannot be specified for CLR table-valued functions.

ROWGUIDCOLROWGUIDCOL
Indica que la nueva columna es una columna de identificador único global de fila.Indicates that the new column is a row globally unique identifier column. Solo se puede designar una columna uniqueidentifier por tabla como columna ROWGUIDCOL.Only one uniqueidentifier column per table can be designated as the ROWGUIDCOL column. La propiedad ROWGUIDCOL únicamente se puede asignar a una columna uniqueidentifier.The ROWGUIDCOL property can be assigned only to a uniqueidentifier column.

La propiedad ROWGUIDCOL no exige que los valores almacenados en la columna sean únicos.The ROWGUIDCOL property does not enforce uniqueness of the values stored in the column. Del mismo modo, tampoco genera automáticamente valores para nuevas filas insertadas en la tabla.It also does not automatically generate values for new rows inserted into the table. Si desea generar valores únicos para cada columna, use la función NEWID en instrucciones INSERT.To generate unique values for each column, use the NEWID function on INSERT statements. Puede especificar un valor predeterminado; sin embargo, no puede especificar NEWID como valor predeterminado.A default value can be specified; however, NEWID cannot be specified as the default.

IDENTITYIDENTITY
Indica que la nueva columna es una columna de identidad.Indicates that the new column is an identity column. Cuando se agrega una nueva fila a la tabla, SQL ServerSQL Server proporciona un valor incremental único para la columna.When a new row is added to the table, SQL ServerSQL Server provides a unique, incremental value for the column. Las columnas de identidad se utilizan normalmente junto con las restricciones PRIMARY KEY como identificadores de fila exclusivos de la tabla.Identity columns are typically used together with PRIMARY KEY constraints to serve as the unique row identifier for the table. La propiedad IDENTITY se puede asignar a columnas tinyint, smallint, int, bigint, decimal(p,0) o numeric(p,0).The IDENTITY property can be assigned to tinyint, smallint, int, bigint, decimal(p,0), or numeric(p,0) columns. Solo se puede crear una columna de identidad para cada tabla.Only one identity column can be created per table. Las restricciones DEFAULT y los valores predeterminados enlazados no se pueden utilizar en las columnas de identidad.Bound defaults and DEFAULT constraints cannot be used with an identity column. Se debe especificar los dos argumentos, seed e increment, o ninguno.You must specify both the seed and increment or neither. Si no se especifica ninguno, el valor predeterminado es (1,1).If neither is specified, the default is (1,1).

No se puede especificar IDENTITY para las funciones CLR con valores de tabla.IDENTITY cannot be specified for CLR table-valued functions.

seedseed
Se trata del valor entero que se asignará a la primera fila de la tabla.Is the integer value to be assigned to the first row in the table.

incrementincrement
Se trata del incremento que se debe agregar al valor de seed en las sucesivas filas de la tabla.Is the integer value to add to the seed value for successive rows in the table.

< column_constraint >::= y < table_constraint>::=< column_constraint >::= and < table_constraint>::=

Define la restricción para la columna o tabla especificada.Defines the constraint for a specified column or table. Para las funciones CLR, el único tipo de restricción permitido es NULL.For CLR functions, the only constraint type allowed is NULL. No se permiten las restricciones con nombre.Named constraints are not allowed.

NULL | NOT NULLNULL | NOT NULL
Determina si se permiten valores NULL en la columna.Determines whether null values are allowed in the column. NULL no es estrictamente una restricción, pero se puede especificar, al igual que NOT NULL.NULL is not strictly a constraint but can be specified just like NOT NULL. No se puede especificar NOT NULL para las funciones CLR con valores de tabla.NOT NULL cannot be specified for CLR table-valued functions.

PRIMARY KEYPRIMARY KEY
Es una restricción que exige la integridad de entidad para la columna especificada a través de un índice único.Is a constraint that enforces entity integrity for a specified column through a unique index. En las funciones con valores de tabla definidas por el usuario, la restricción PRIMARY KEY solamente se puede crear en una columna de cada tabla.In table-valued user-defined functions, the PRIMARY KEY constraint can be created on only one column per table. No se puede especificar PRIMARY KEY para las funciones CLR con valores de tabla.PRIMARY KEY cannot be specified for CLR table-valued functions.

UNIQUEUNIQUE
Es una restricción que proporciona la integridad de entidad para una o varias columnas especificadas a través de un índice único.Is a constraint that provides entity integrity for a specified column or columns through a unique index. Las tablas pueden tener varias restricciones UNIQUE.A table can have multiple UNIQUE constraints. No se puede especificar UNIQUE para las funciones CLR con valores de tabla.UNIQUE cannot be specified for CLR table-valued functions.

CLUSTERED | NONCLUSTEREDCLUSTERED | NONCLUSTERED
Indica que se ha creado un índice clúster o no clúster para la restricción PRIMARY KEY o UNIQUE.Indicate that a clustered or a nonclustered index is created for the PRIMARY KEY or UNIQUE constraint. Las restricciones PRIMARY KEY utilizan CLUSTERED y las restricciones UNIQUE, NONCLUSTERED.PRIMARY KEY constraints use CLUSTERED, and UNIQUE constraints use NONCLUSTERED.

CLUSTERED solamente se puede especificar para una restricción.CLUSTERED can be specified for only one constraint. Si se especifica CLUSTERED para una restricción UNIQUE y también se especifica una restricción PRIMARY KEY, esta última utilizará NONCLUSTERED.If CLUSTERED is specified for a UNIQUE constraint and a PRIMARY KEY constraint is also specified, the PRIMARY KEY uses NONCLUSTERED.

No se pueden especificar CLUSTERED y NONCLUSTERED para las funciones CLR con valores de tabla.CLUSTERED and NONCLUSTERED cannot be specified for CLR table-valued functions.

CHECKCHECK
Es una restricción que exige la integridad del dominio al limitar los valores posibles que se pueden escribir en una o varias columnas.Is a constraint that enforces domain integrity by limiting the possible values that can be entered into a column or columns. No se pueden especificar restricciones CHECK para las funciones CLR con valores de tabla.CHECK constraints cannot be specified for CLR table-valued functions.

logical_expressionlogical_expression
Es una expresión lógica que devuelve TRUE o FALSE.Is a logical expression that returns TRUE or FALSE.

<computed_column_definition>::=<computed_column_definition>::=

Especifica una columna calculada.Specifies a computed column. Para obtener más información sobre las columnas calculadas, consulte CREATE TABLE (Transact-SQL).For more information about computed columns, see CREATE TABLE (Transact-SQL).

column_namecolumn_name
Es el nombre de la columna calculada.Is the name of the computed column.

computed_column_expressioncomputed_column_expression
Es una expresión que define el valor de una columna calculada.Is an expression that defines the value of a computed column.

<index_option>::=<index_option>::=

Especifica las opciones de índice para el índice PRIMARY KEY o UNIQUE.Specifies the index options for the PRIMARY KEY or UNIQUE index. Para más información sobre las opciones de índice, vea CREATE INDEX (Transact-SQL).For more information about index options, see CREATE INDEX (Transact-SQL).

PAD_INDEX = { ON | OFF }PAD_INDEX = { ON | OFF }
Especifica el relleno del índice.Specifies index padding. El valor predeterminado es OFF.The default is OFF.

FILLFACTOR = fillfactorFILLFACTOR = fillfactor
Especifica un porcentaje que indica cuánto debe llenar el Motor de base de datosDatabase Engine el nivel hoja de cada página de índice durante la creación o modificación de los índices.Specifies a percentage that indicates how full the Motor de base de datosDatabase Engine should make the leaf level of each index page during index creation or change. fillfactor debe ser un valor entero comprendido entre 1 y 100.fillfactor must be an integer value from 1 to 100. El valor predeterminado es 0.The default is 0.

IGNORE_DUP_KEY = { ON | OFF }IGNORE_DUP_KEY = { ON | OFF }
Especifica la respuesta de error cuando una operación de inserción intenta insertar valores de clave duplicados en un índice único.Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. La opción IGNORE_DUP_KEY se aplica solamente a operaciones de inserción realizadas tras crear o volver a generar el índice.The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. El valor predeterminado es OFF.The default is OFF.

STATISTICS_NORECOMPUTE = { ON | OFF }STATISTICS_NORECOMPUTE = { ON | OFF }
Especifica si se vuelven a calcular las estadísticas de distribución.Specifies whether distribution statistics are recomputed. El valor predeterminado es OFF.The default is OFF.

ALLOW_ROW_LOCKS = { ON | OFF }ALLOW_ROW_LOCKS = { ON | OFF }
Especifica si se permiten los bloqueos de fila.Specifies whether row locks are allowed. El valor predeterminado es ON.The default is ON.

ALLOW_PAGE_LOCKS = { ON | OFF }ALLOW_PAGE_LOCKS = { ON | OFF }
Especifica si se permiten bloqueos de página.Specifies whether page locks are allowed. El valor predeterminado es ON.The default is ON.

Procedimientos recomendadosBest Practices

Si una función definida por el usuario no se crea con la cláusula SCHEMABINDING, los cambios que se realicen en los objetos subyacentes pueden afectar a la definición de la función y generar resultados inesperados al invocarla.If a user-defined function is not created with the SCHEMABINDING clause, changes that are made to underlying objects can affect the definition of the function and produce unexpected results when it is invoked. Recomendamos implementar uno de los siguientes métodos para garantizar que la función no queda sin actualizar como consecuencia de los cambios realizados en sus objetos subyacentes:We recommend that you implement one of the following methods to ensure that the function does not become outdated because of changes to its underlying objects:

  • Especifique la cláusula WITH SCHEMABINDING cuando vaya a crear la función.Specify the WITH SCHEMABINDING clause when you are creating the function. Así se asegura de que no se pueden modificar los objetos a los que se hace referencia en la definición de la función a menos que también se modifique la función.This ensures that the objects referenced in the function definition cannot be modified unless the function is also modified.

  • Ejecute el procedimiento almacenado sp_refreshsqlmodule después de modificar cualquier objeto que se especifique en la definición de la función.Execute the sp_refreshsqlmodule stored procedure after modifying any object that is specified in the definition of the function.

Importante

Para obtener más información y consideraciones de rendimiento de funciones insertadas con valores de tabla (TVF insertadas) y funciones con valores de tabla de varias instrucciones (MSTVF), vea Crear funciones definidas por el usuario (motor de base de datos).For more information and performance considerations about inline table-valued functions (inline TVFs) and multi-statement table-valued functions (MSTVFs), see Create User-defined Functions (Database Engine).

Tipos de datosData Types

Si se especifican parámetros en una función CLR, deben ser de tipos de SQL ServerSQL Server tal como se definieron anteriormente para scalar_parameter_data_type.If parameters are specified in a CLR function, they should be SQL ServerSQL Server types as defined previously for scalar_parameter_data_type. Para más información sobre la comparación de los tipos de datos del sistema de SQL ServerSQL Server con los tipos de datos de integración de CLR o los tipos de datos de .NET Framework.NET Framework Common Language Runtime, vea Mapping CLR Parameter Data (Asignar datos de parámetros CLR).For information about comparing SQL ServerSQL Server system data types to CLR integration data types or .NET Framework.NET Framework common language runtime data types, see Mapping CLR Parameter Data.

Para que SQL ServerSQL Server haga referencia al método correcto cuando se sobrecarga en una clase, el método indicado en <method_specifier> debe tener las siguientes características:For SQL ServerSQL Server to reference the correct method when it is overloaded in a class, the method indicated in <method_specifier> must have the following characteristics:

  • Recibir el mismo número de parámetros que se especifica en [ ,...n ].Receive the same number of parameters as specified in [ ,...n ].

  • Recibir todos los parámetros por valor y no por referencia.Receive all the parameters by value, not by reference.

  • Utilizar tipos de parámetros que sean compatibles con los especificados en la función de SQL ServerSQL Server.Use parameter types that are compatible with those specified in the SQL ServerSQL Server function.

Si el tipo de datos devuelto de la función CLR especifica un tipo de tabla (RETURNS TABLE), el tipo de datos devuelto del método de <method_specifier> debe ser IEnumerator o IEnumerable, y se da por supuesto que el creador de la función implementa la interfaz.If the return data type of the CLR function specifies a table type (RETURNS TABLE), the return data type of the method in <method_specifier> should be of type IEnumerator or IEnumerable, and it is assumed that the interface is implemented by the creator of the function. A diferencia de las funciones Transact-SQLTransact-SQL, las funciones CLR no pueden incluir restricciones PRIMARY KEY, UNIQUE o CHECK en <table_type_definition>.Unlike Transact-SQLTransact-SQL functions, CLR functions cannot include PRIMARY KEY, UNIQUE, or CHECK constraints in <table_type_definition>. Los tipos de datos de las columnas especificadas en <table_type_definition> deben coincidir con los tipos de las columnas correspondientes del conjunto de resultados devuelto por el método en <method_specifier> en tiempo de ejecución.The data types of columns specified in <table_type_definition> must match the types of the corresponding columns of the result set returned by the method in <method_specifier> at execution time. Esta comprobación del tipo no se lleva a cabo en el momento de crear la función.This type-checking is not performed at the time the function is created.

Para más información sobre la programación de funciones CLR, vea CLR User-Defined Functions (Funciones CLR definidas por el usuario).For more information about how to program CLR functions, see CLR User-Defined Functions.

Notas generalesGeneral Remarks

Se pueden invocar funciones escalares cuando se utilizan expresiones escalares.Scalar functions can be invoked where scalar expressions are used. Esto incluye las columnas calculadas y las definiciones de restricciones CHECK.This includes computed columns and CHECK constraint definitions. Las funciones escalares también se pueden ejecutar con la instrucción EXECUTE.Scalar functions can also be executed by using the EXECUTE statement. Las funciones escalares deben invocarse como mínimo con el nombre de dos partes de la función (.).Scalar functions must be invoked by using at least the two-part name of the function (.). Para más información sobre los nombres con varias partes, vea Convenciones de sintaxis de Transact-SQL (Transact-SQL).For more information about multipart names, see Transact-SQL Syntax Conventions (Transact-SQL). Las funciones con valores de tabla se pueden invocar cuando se admiten expresiones de tabla en la cláusula FROM de instrucciones SELECT, INSERT, UPDATE o DELETE.Table-valued functions can be invoked where table expressions are allowed in the FROM clause of SELECT, INSERT, UPDATE, or DELETE statements. Para más información, vea Ejecutar funciones definidas por el usuario.For more information, see Execute User-defined Functions.

InteroperabilidadInteroperability

Las siguientes instrucciones son válidas en una función:The following statements are valid in a function:

  • Instrucciones de asignación.Assignment statements.

  • Instrucciones de control de flujo excepto instrucciones TRY...CATCH.Control-of-Flow statements except TRY...CATCH statements.

  • Instrucciones DECLARE que definen variables de datos y cursores locales.DECLARE statements defining local data variables and local cursors.

  • Instrucciones SELECT que contienen listas de selección con expresiones que asignan valores a variables locales.SELECT statements that contain select lists with expressions that assign values to local variables.

  • Operaciones de cursor que hacen referencia a cursores locales que se declaran, abren, cierran y cuya asignación se cancela en la función.Cursor operations referencing local cursors that are declared, opened, closed, and deallocated in the function. Solamente se permiten las instrucciones FETCH que asignan valores a las variables locales mediante la cláusula INTO; no se permiten las instrucciones FETCH que devuelven datos al cliente.Only FETCH statements that assign values to local variables using the INTO clause are allowed; FETCH statements that return data to the client are not allowed.

  • Instrucciones INSERT, UPDATE y DELETE que modifican variables de tabla locales.INSERT, UPDATE, and DELETE statements modifying local table variables.

  • Instrucciones EXECUTE que llaman a procedimientos almacenados extendidos.EXECUTE statements calling extended stored procedures.

Para más información, vea Crear funciones definidas por el usuario (motor de base de datos).For more information, see Create User-defined Functions (Database Engine).

Interoperabilidad de columna calculadaComputed Column Interoperability

Las funciones tienen las propiedades siguientes.Functions have the following properties. Los valores de estas propiedades determinan si las funciones se pueden utilizar en columnas calculadas, que pueden ser persistentes o indizadas.The values of these properties determine whether functions can be used in computed columns that can be persisted or indexed.

PropiedadProperty DescripciónDescription NotasNotes
IsDeterministicIsDeterministic La función es determinista o no determinista.Function is deterministic or nondeterministic. En las funciones deterministas, se permite el acceso a los datos locales.Local data access is allowed in deterministic functions. Por ejemplo, se consideran deterministas las funciones que devuelven siempre el mismo resultado al llamarlas, utilizando un conjunto específico de valores de entrada y con el mismo estado de la base de datos.For example, functions that always return the same result any time they are called by using a specific set of input values and with the same state of the database would be labeled deterministic.
IsPreciseIsPrecise La función es precisa o imprecisa.Function is precise or imprecise. Las funciones imprecisas contienen operaciones, como operaciones de punto flotante.Imprecise functions contain operations such as floating point operations.
IsSystemVerifiedIsSystemVerified SQL ServerSQL Server puede comprobar las propiedades de precisión y determinismo de la función.The precision and determinism properties of the function can be verified by SQL ServerSQL Server.
SystemDataAccessSystemDataAccess La función tiene acceso a los datos del sistema (catálogos del sistema o tablas del sistema virtuales) en la instancia local de SQL ServerSQL Server.Function accesses system data (system catalogs or virtual system tables) in the local instance of SQL ServerSQL Server.
UserDataAccessUserDataAccess La función tiene acceso a los datos del usuario en la instancia local de SQL ServerSQL Server.Function accesses user data in the local instance of SQL ServerSQL Server. Incluye las tablas temporales y las definidas por el usuario, pero no las variables de tabla.Includes user-defined tables and temp tables, but not table variables.

Transact-SQLTransact-SQL determina automáticamente las propiedades de precisión y determinismo de las funciones SQL ServerSQL Server.The precision and determinism properties of Transact-SQLTransact-SQL functions are determined automatically by SQL ServerSQL Server. El usuario puede especificar las propiedades de acceso a datos y determinismo de las funciones CLR.The data access and determinism properties of CLR functions can be specified by the user. Para más información, vea Overview of CLR Integration Custom Attributes (Información general de los atributos personalizados de la integración CLR).For more information, see Overview of CLR Integration Custom Attributes.

Para ver los valores actuales de estas propiedades, use OBJECTPROPERTYEX.To display the current values for these properties, use OBJECTPROPERTYEX.

Importante

Se deben crear las funciones de manera que el SCHEMABINDING sea determinista.Functions must be created with SCHEMABINDING to be deterministic.

Una columna calculada que llama a una función definida por el usuario se puede utilizar en un índice cuando la función definida por el usuario tiene los siguientes valores de propiedades:A computed column that invokes a user-defined function can be used in an index when the user-defined function has the following property values:

  • IsDeterministic = trueIsDeterministic = true
  • IsSystemVerified = true (a menos que la columna calculada sea persistente)IsSystemVerified = true (unless the computed column is persisted)
  • UserDataAccess = falseUserDataAccess = false
  • SystemDataAccess = falseSystemDataAccess = false

Para obtener más información, vea Indexes on Computed Columns.For more information, see Indexes on Computed Columns.

Llamar a procedimientos almacenados extendidos desde funcionesCalling Extended Stored Procedures from Functions

Cuando se llama a un procedimiento almacenado extendido desde una función, no se puede devolver al cliente el conjunto de resultados.The extended stored procedure, when it is called from inside a function, cannot return result sets to the client. Cualquier API ODS que devuelva conjuntos de resultados al cliente devolverá FAIL.Any ODS APIs that return result sets to the client will return FAIL. El procedimiento almacenado extendido se puede volver a conectar a una instancia de SQL ServerSQL Server; sin embargo, no debería intentar combinar la misma transacción como la función que invocó el procedimiento almacenado extendido.The extended stored procedure could connect back to an instance of SQL ServerSQL Server; however, it should not try to join the same transaction as the function that invoked the extended stored procedure.

Como ocurre con las invocaciones desde un proceso por lotes o un procedimiento almacenado, el procedimiento almacenado extendido se ejecutará en el contexto de la cuenta de seguridad de Windows en la que se ejecuta SQL ServerSQL Server.Similar to invocations from a batch or stored procedure, the extended stored procedure will be executed in the context of the Windows security account under which SQL ServerSQL Server is running. El propietario del procedimiento almacenado debe tener esto en cuenta al otorgar permisos EXECUTE a los usuarios.The owner of the stored procedure should consider this when giving EXECUTE permission on it to users.

Limitaciones y restriccionesLimitations and Restrictions

Las funciones definidas por el usuario no se pueden utilizar para realizar acciones que modifican el estado de la base de datos.User-defined functions cannot be used to perform actions that modify the database state.

Las funciones definidas por el usuario no pueden tener una cláusula OUTPUT INTO que tenga una tabla como destino.User-defined functions cannot contain an OUTPUT INTO clause that has a table as its target.

Las siguientes instrucciones de Service BrokerService Broker no se pueden incluir en la definición de una función Transact-SQLTransact-SQL definida por el usuario:The following Service BrokerService Broker statements cannot be included in the definition of a Transact-SQLTransact-SQL user-defined function:

  • BEGIN DIALOG CONVERSATION

  • END CONVERSATION

  • GET CONVERSATION GROUP

  • MOVE CONVERSATION

  • RECEIVE

  • SEND

Las funciones definidas por el usuario se pueden anidar; es decir, una función definida por el usuario puede llamar a otra.User-defined functions can be nested; that is, one user-defined function can call another. El nivel de anidamiento aumenta cuando se empieza a ejecutar la función llamada y disminuye cuando se termina de ejecutar la función llamada.The nesting level is incremented when the called function starts execution, and decremented when the called function finishes execution. Las funciones definidas por el usuario se pueden anidar hasta un máximo de 32 niveles.User-defined functions can be nested up to 32 levels. Si se superan los niveles máximos de anidamiento, la cadena completa de funciones de llamada produce un error.Exceeding the maximum levels of nesting causes the whole calling function chain to fail. Cualquier referencia a código administrado desde una función Transact-SQLTransact-SQL definida por el usuario cuenta como uno de los 32 niveles de anidamiento.Any reference to managed code from a Transact-SQLTransact-SQL user-defined function counts as one level against the 32-level nesting limit. Los métodos invocados desde el código administrado no cuentan para este límite.Methods invoked from within managed code do not count against this limit.

Usar el criterio de ordenación en funciones CLR con valores de tablaUsing Sort Order in CLR Table-valued Functions

Cuando utilice la cláusula ORDER en funciones CLR con valores de tabla, siga estas instrucciones:When using the ORDER clause in CLR table-valued functions, follow these guidelines:

  • Debe asegurarse de que los resultados siempre se ordenan según el criterio especificado.You must ensure that results are always ordered in the specified order. Si los resultados no están en el orden especificado, SQL ServerSQL Server generará un mensaje de error cuando se ejecute la consulta.If the results are not in the specified order, SQL ServerSQL Server will generate an error message when the query is executed.

  • Si se especifica una cláusula ORDER, el resultado de la función con valores de tabla debe estar ordenado según la intercalación de la columna (explícita o implícita).If an ORDER clause is specified, the output of the table-valued function must be sorted according to the collation of the column (explicit or implicit). Por ejemplo, si la intercalación de la columna es chino (especificado en el archivo DDL para la función con valores de tabla u obtenido a partir de la intercalación de la base de datos), los resultados devueltos deben estar ordenados según las reglas de ordenación chinas.For example, if the column collation is Chinese (either specified in the DDL for the table-valued function or obtained from the database collation), the returned results must be sorted according to Chinese sorting rules.

  • SQL ServerSQL Server siempre comprueba la cláusula ORDER, si se especifica, durante la devolución de resultados, independientemente de si el procesador de consultas la utiliza para realizar más optimizaciones o no.The ORDER clause, if specified, is always verified by SQL ServerSQL Server while returning results, whether or not it is used by the query processor to perform further optimizations. Utilice la cláusula ORDER solamente si sabe que será útil para el procesador de consultas.Only use the ORDER clause if you know it is useful to the query processor.

  • El procesador de consultas de SQL ServerSQL Server utiliza de forma automática la cláusula ORDER en los siguientes casos:The SQL ServerSQL Server query processor takes advantage of the ORDER clause automatically in following cases:

    • Consultas Insert en las que la cláusula ORDER es compatible con un índice.Insert queries where the ORDER clause is compatible with an index.

    • Cláusulas ORDER BY que son compatibles con la cláusula ORDER.ORDER BY clauses that are compatible with the ORDER clause.

    • Agregados, donde GROUP BY es compatible con cláusula ORDER.Aggregates, where GROUP BY is compatible with ORDER clause.

    • Agregados DISTINCT donde las columnas distintas son compatibles con la cláusula ORDER.DISTINCT aggregates where the distinct columns are compatible with the ORDER clause.

La cláusula ORDER no garantiza que los resultados estén ordenados al ejecutar una consulta SELECT, a menos que también se especifique la cláusula ORDER BY en la consulta.The ORDER clause does not guarantee ordered results when a SELECT query is executed, unless ORDER BY is also specified in the query. Vea sys.function_order_columns (Transact-SQL) para más información sobre cómo consultar las columnas incluidas en el criterio de ordenación para las funciones con valores de tabla.See sys.function_order_columns (Transact-SQL) for information on how to query for columns included in the sort-order for table-valued functions.

MetadatosMetadata

En la siguiente tabla se enumeran las vistas de catálogo del sistema que puede utilizar para devolver metadatos sobre las funciones definidas por el usuario.The following table lists the system catalog views that you can use to return metadata about user-defined functions.

Vista del sistemaSystem View DescripciónDescription
sys.sql_modulessys.sql_modules Vea el ejemplo E en la sección Ejemplos más abajo.See example E in the Examples section below.
sys.assembly_modulessys.assembly_modules Muestra información sobre funciones definidas por el usuario CLR.Displays information about CLR user-defined functions.
sys.parameterssys.parameters Muestra información sobre los parámetros definidos en funciones definidas por el usuario.Displays information about the parameters defined in user-defined functions.
sys.sql_expression_dependenciessys.sql_expression_dependencies Muestra los objetos subyacentes a los que hace referencia una función.Displays the underlying objects referenced by a function.

PermisosPermissions

Se requiere el permiso CREATE FUNCTION en la base de datos y el permiso ALTER en el esquema en el que se va a crear la función.Requires CREATE FUNCTION permission in the database and ALTER permission on the schema in which the function is being created. Si la función especifica un tipo definido por el usuario, requiere el permiso EXECUTE en el tipo.If the function specifies a user-defined type, requires EXECUTE permission on the type.

EjemplosExamples

Nota

Para obtener más ejemplos y consideraciones de rendimiento sobre las funciones definidas por el usuario, vea Crear funciones definidas por el usuario (motor de base de datos).For more examples and performance considerations about UDFs, see Create User-defined Functions (Database Engine).

A.A. Usar una función con valores escalares definida por el usuario que calcula la semana ISOUsing a scalar-valued user-defined function that calculates the ISO week

En el ejemplo siguiente se crea la función definida por el usuario ISOweek.The following example creates the user-defined function ISOweek. Esta función toma un argumento de fecha para calcular el número de semana ISO.This function takes a date argument and calculates the ISO week number. Para que esta función calcule correctamente, se debe invocar SET DATEFIRST 1 antes de llamar a la función.For this function to calculate correctly, SET DATEFIRST 1 must be invoked before the function is called.

En el ejemplo también se muestra el uso de la cláusula EXECUTE AS para especificar el contexto de seguridad en el que se puede ejecutar un procedimiento almacenado.The example also shows using the EXECUTE AS clause to specify the security context in which a stored procedure can be executed. En el ejemplo, la opción CALLER especifica que el procedimiento se ejecutará en el contexto del usuario que lo llama.In the example, the option CALLER specifies that the procedure will be executed in the context of the user that calls it. Las otras opciones que puede especificar son SELF, OWNER, y user_name.The other options that you can specify are SELF, OWNER, and user_name.

Esta es la llamada a la función.Here is the function call. Observe que el valor de DATEFIRST es 1.Notice that DATEFIRST is set to 1.

CREATE FUNCTION dbo.ISOweek (@DATE datetime)  
RETURNS int  
WITH EXECUTE AS CALLER  
AS  
BEGIN  
     DECLARE @ISOweek int;  
     SET @ISOweek= DATEPART(wk,@DATE)+1  
          -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104');  
--Special cases: Jan 1-3 may belong to the previous year  
     IF (@ISOweek=0)   
          SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1   
               AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1;  
--Special case: Dec 29-31 may belong to the next year  
     IF ((DATEPART(mm,@DATE)=12) AND   
          ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))  
          SET @ISOweek=1;  
     RETURN(@ISOweek);  
END;  
GO  
SET DATEFIRST 1;  
SELECT dbo.ISOweek(CONVERT(DATETIME,'12/26/2004',101)) AS 'ISO Week';  

El conjunto de resultados es el siguiente.Here is the result set.

ISO Week  
----------------  
52  

B.B. Crear una función alineada con valores de tablaCreating an inline table-valued function

El ejemplo siguiente devuelve una función insertada con valores de tabla en la base de datos AdventureWorks2012AdventureWorks2012.The following example returns an inline table-valued function in the AdventureWorks2012AdventureWorks2012 database. Devuelve tres columnas ProductID, Name y el agregado de ventas totales anuales hasta la fecha por tienda como YTD Total para cada producto vendido a la tienda.It returns three columns ProductID, Name and the aggregate of year-to-date totals by store as YTD Total for each product sold to the store.

CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)  
RETURNS TABLE  
AS  
RETURN   
(  
    SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'  
    FROM Production.Product AS P   
    JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID  
    JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID  
    JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID  
    WHERE C.StoreID = @storeid  
    GROUP BY P.ProductID, P.Name  
);  
GO  

Para invocar la función, ejecute esta consulta.To invoke the function, run this query.

SELECT * FROM Sales.ufn_SalesByStore (602);  

C.C. Crear una función con valores de tabla de múltiples instruccionesCreating a multi-statement table-valued function

En el ejemplo siguiente se crea la función con valores de tabla fn_FindReports(InEmpID) en la base de datos AdventureWorks2012.The following example creates the table-valued function fn_FindReports(InEmpID) in the AdventureWorks2012 database. Cuando se suministra un identificador de empleado válido, la función devuelve una tabla de todos los empleados que están bajo las órdenes de ese empleado tanto directa como indirectamente.When supplied with a valid employee ID, the function returns a table that corresponds to all the employees that report to the employee either directly or indirectly. La función utiliza la expresión de tabla común (CTE) recursiva para producir la lista jerárquica de empleados.The function uses a recursive common table expression (CTE) to produce the hierarchical list of employees. Para más información sobre las CTE recursivas, vea WITH common_table_expression (Transact-SQL).For more information about recursive CTEs, see WITH common_table_expression (Transact-SQL).

CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER)  
RETURNS @retFindReports TABLE   
(  
    EmployeeID int primary key NOT NULL,  
    FirstName nvarchar(255) NOT NULL,  
    LastName nvarchar(255) NOT NULL,  
    JobTitle nvarchar(50) NOT NULL,  
    RecursionLevel int NOT NULL  
)  
--Returns a result set that lists all the employees who report to the   
--specific employee directly or indirectly.*/  
AS  
BEGIN  
WITH EMP_cte(EmployeeID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel) -- CTE name and columns  
    AS (  
        -- Get the initial list of Employees for Manager n
        SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, 0   
        FROM HumanResources.Employee e   
INNER JOIN Person.Person p   
ON p.BusinessEntityID = e.BusinessEntityID  
        WHERE e.BusinessEntityID = @InEmpID  
        UNION ALL  
        -- Join recursive member to anchor
        SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, RecursionLevel + 1   
        FROM HumanResources.Employee e   
            INNER JOIN EMP_cte  
            ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode  
INNER JOIN Person.Person p   
ON p.BusinessEntityID = e.BusinessEntityID  
        )  
-- copy the required columns to the result of the function   
   INSERT @retFindReports  
   SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel  
   FROM EMP_cte   
   RETURN  
END;  
GO  
-- Example invocation  
SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel  
FROM dbo.ufn_FindReports(1);   
  
GO  

D.D. Crear una función CLRCreating a CLR function

En el ejemplo se crea la función CLR len_s.The example creates CLR function len_s. Antes de crear la función, el ensamblado SurrogateStringFunction.dll se registra en la base de datos local.Before the function is created, the assembly SurrogateStringFunction.dll is registered in the local database.

Se aplica a: SQL ServerSQL Server (desde SQL Server 2008SQL Server 2008 SP1 hasta SQL Server 2017SQL Server 2017)Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 SP1 through SQL Server 2017SQL Server 2017)

DECLARE @SamplesPath nvarchar(1024);  
-- You may have to modify the value of this variable if you have  
-- installed the sample in a location other than the default location.  
SELECT @SamplesPath = REPLACE(physical_name, 'Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\master.mdf', 
                                              'Microsoft SQL Server\130\Samples\Engine\Programmability\CLR\')   
    FROM master.sys.database_files   
    WHERE name = 'master';  
  
CREATE ASSEMBLY [SurrogateStringFunction]  
FROM @SamplesPath + 'StringManipulate\CS\StringManipulate\bin\debug\SurrogateStringFunction.dll'  
WITH PERMISSION_SET = EXTERNAL_ACCESS;  
GO  
  
CREATE FUNCTION [dbo].[len_s] (@str nvarchar(4000))  
RETURNS bigint  
AS EXTERNAL NAME [SurrogateStringFunction].[Microsoft.Samples.SqlServer.SurrogateStringFunction].[LenS];  
GO  

Para ver un ejemplo de creación de una función CLR con valores de tabla, vea CLR Table-Valued Functions (Funciones CLR con valores de tabla).For an example of how to create a CLR table-valued function, see CLR Table-Valued Functions.

E.E. Mostrar la definición de funciones definidas por el usuario de Transact-SQLTransact-SQLDisplaying the definition of Transact-SQLTransact-SQL user-defined functions

SELECT definition, type   
FROM sys.sql_modules AS m  
JOIN sys.objects AS o ON m.object_id = o.object_id   
    AND type IN ('FN', 'IF', 'TF');  
GO  

La definición de funciones creadas con la opción ENCRYPTION no se puede ver con sys.sql_modules; con todo, se muestra otra información sobre las funciones cifradas.The definition of functions created by using the ENCRYPTION option cannot be viewed by using sys.sql_modules; however, other information about the encrypted functions is displayed.

Consulte tambiénSee Also

Crear funciones definidas por el usuario (motor de base de datos) Create User-defined Functions (Database Engine)
ALTER FUNCTION (Transact-SQL) ALTER FUNCTION (Transact-SQL)
DROP FUNCTION (Transact-SQL) DROP FUNCTION (Transact-SQL)
OBJECTPROPERTYEX (Transact-SQL) OBJECTPROPERTYEX (Transact-SQL)
sys.sql_modules (Transact-SQL) sys.sql_modules (Transact-SQL)
sys.assembly_modules (Transact-SQL) sys.assembly_modules (Transact-SQL)
EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
CLR User-Defined Functions (Funciones definidas por el usuario CLR)CLR User-Defined Functions
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
CREATE SECURITY POLICY (Transact-SQL)CREATE SECURITY POLICY (Transact-SQL)