Compartir a través de


ALTER FUNCTION (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de análisis SQL en Microsoft FabricWarehouse en Microsoft FabricBase de datos SQL de Microsoft Fabric

Modifica una función de CLR o Transact-SQL existente que se creó anteriormente ejecutando la CREATE FUNCTION instrucción , sin cambiar los permisos y sin afectar a funciones, procedimientos almacenados o desencadenadores dependientes.

Sugerencia

Puede especificar CREATE OR ALTER FUNCTION para crear una nueva función si no existe por ese nombre, o modificar una función existente, en una sola instrucción.

Convenciones de sintaxis de Transact-SQL

Sintaxis

-- Transact-SQL Scalar Function Syntax    
ALTER FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]
-- Transact-SQL Inline Table-Valued Function Syntax
ALTER FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
  ]  
)  
RETURNS TABLE  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    RETURN [ ( ] select_stmt [ ) ]  
[ ; ]  
-- Transact-SQL Multistatement Table-valued Function Syntax
ALTER FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
    [ = default ] }   
    [ ,...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 ]  
} 

<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 and Table-Valued Function Syntax
ALTER FUNCTION [ schema_name. ] function_name   
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
)  
RETURNS { return_data_type | TABLE <clr_table_type_definition> }  
    [ WITH <clr_function_option> [ ,...n ] ]  
    [ AS ] EXTERNAL NAME <method_specifier>  
[ ; ]  
-- CLR Function Clauses
<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 ] )  
-- Syntax for In-Memory OLTP: Natively compiled, scalar user-defined function  
ALTER FUNCTION [ schema_name. ] function_name    
 ( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type   
    [ NULL | NOT NULL ] [ = default ] }   
    [ ,...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 ]   
}  

Argumentos

schema_name

Nombre del esquema al que pertenece la función definida por el usuario.

function_name

Función definida por el usuario que se va a cambiar.

Nota:

Los paréntesis después del nombre de la función son necesarios, aunque no se especifique un parámetro.

@ parameter_name

Parámetro de la función definida por el usuario. Es posible declarar uno o varios parámetros.

Una función puede tener un máximo de 2.100 parámetros. 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.

Especifique un nombre de parámetro con una arroba ( @ ) como primer carácter. El nombre del parámetro debe cumplir las mismas reglas para identifiers. Los parámetros son locales para la función; los mismos nombres de parámetro se pueden utilizar en otras funciones. 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.

Nota:

No se respeta ANSI_WARNINGS al pasar parámetros de un procedimiento almacenado, una función definida por el usuario o al declarar y establecer variables en una instrucción de lote. 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.

[ type_schema_name. ] parameter_data_type

Es el tipo de datos del parámetro y, de forma opcional, el esquema al que pertenece. Para las funciones Transact-SQL, se permiten todos los tipos de datos, incluidos los tipos definidos por el usuario CLR, a excepción del tipo de datos timestamp. Para las funciones CLR, se permiten todos los tipos de datos, incluidos los tipos CLR definidos por el usuario, a excepción de los tipos de datos text, ntext, image y timestamp. Los tipos de datos no escalares, cursor y table, no se pueden especificar como tipos de datos de parámetro en funciones Transact-SQL ni en funciones CLR.

Si no se especifica type_schema_name, el Motor de base de datos de SQL Server busca parameter_data_type en este orden:

  • El esquema que contiene los nombres de los tipos de datos del sistema de SQL Server.

  • El esquema predeterminado del usuario actual en la base de datos actual.

  • El esquema dbo en la base de datos actual.

[ = valor predeterminado ] **

Valor predeterminado del parámetro. Si se define un valor default, la función se puede ejecutar sin especificar un valor para ese parámetro.

Nota:

Se pueden especificar valores predeterminados de parámetros para las funciones CLR, excepto para los tipos de datos varchar(max) y varbinary(max) .

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. 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.

return_data_type

Valor devuelto de una función escalar definida por el usuario. Para las funciones Transact-SQL, se permiten todos los tipos de datos, incluidos los tipos definidos por el usuario CLR, a excepción del tipo de datos timestamp. Para las funciones CLR, se permiten todos los tipos de datos, incluidos los tipos CLR definidos por el usuario, a excepción de los tipos de datos text, ntext, image y timestamp. Los tipos de datos no escalares, cursor y table, no se pueden especificar como tipos de datos devueltos en funciones Transact-SQL ni en funciones CLR.

function_body

Especifica que una serie de instrucciones Transact-SQL, que juntas no producen ningún efecto secundario (como modificar una tabla), definen el valor de la función. function_body solamente se usa en funciones escalares y en funciones con valores de tabla de múltiples instrucciones.

En las funciones escalares, function_body es una serie de instrucciones Transact-SQL que se evalúan como un valor escalar.

En las funciones con valores de tabla de varias instrucciones, function_body es una serie de instrucciones Transact-SQL que rellenan una variable devuelta de TABLE.

scalar_expression

Especifica que la función escalar devuelve un valor escalar.

TABLA

Especifica que el valor devuelto de la función con valores de tabla es una tabla. Solamente se pueden pasar constantes y @local_variables a las funciones con valores de tabla.

En las funciones insertadas con valores de tabla, el valor devuelto de TABLE se define mediante una única instrucción SELECT. Las funciones insertadas no tienen variables devueltas asociadas.

En las funciones con valores de tabla de múltiples instrucciones, @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. @ return_variable solamente se puede especificar para funciones Transact-SQL, no para funciones CLR.

select-stmt

Instrucción SELECT única que define el valor devuelto de una función insertada con valores de tabla.

EXTERNAL NAME <method_specifierassembly_name.class>_name.method_name

Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

Especifica el método de un ensamblado que se enlaza a la función. assembly_name debe coincidir con un ensamblado existente en SQL Server, en la base de datos actual con la visibilidad activada. class_name debe ser un identificador de SQL Server válido y debe existir como clase en el ensamblado. Si la clase tiene un nombre completo de espacio de nombres que usa un punto ( . ) para separar las partes del espacio de nombres, el nombre de la clase debe delimitarse mediante paréntesis ( [] ) o comillas ( "" ). method_name debe ser un identificador SQL Server válido y debe existir como método estático en la clase especificada.

Nota:

De manera predeterminada, SQL Server no puede ejecutar código CLR. 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 Server hasta que se habilite la opción clr enabled. Para habilitar esta opción, use sp_configure.

Nota:

Esta opción no está disponible en las bases de datos independientes.

< > table_type_definition( { <column_definition><column_constraint> | <> computed_column_definition } [ <table_constraint> ] [ ,... n ] )

Define el tipo de datos de tabla para una función Transact-SQL. La declaración de tabla incluye definiciones de columna y restricciones de columna o de tabla.

< > clr_table_type_definition ( { column_namedata_type } [ ,... n ] )

Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, SQL Database (versión preliminar en algunas regiones).

Define los tipos de datos de tabla para una función CLR. La declaración de tabla solamente incluye nombres de columna y tipos de datos.

NULL|NOT NULL

Solo admite funciones escalares definidas por el usuario compiladas de forma nativa. Para obtener más información, vea Funciones escalares definidas por el usuario para OLTP en memoria.

COMPILACIÓN_NATIVA

Indica si una función definida por el usuario se compila de forma nativa. Este argumento es obligatorio en funciones escalares definidas por el usuario compiladas de forma nativa.

El argumento NATIVE_COMPILATION es necesario para modificar la función y solo se puede usar si la función se ha creado con el argumento NATIVE_COMPILATION.

COMIENCE ATOMIC CON

Solo admite funciones escalares definidas por el usuario compiladas de forma nativa y es obligatorio. Para obtener más información, vea Bloques atómicos en procedimientos nativos.

SCHEMABINDING

El argumento SCHEMABINDING se requiere para las funciones escalares definidas por el usuario compiladas de forma nativa.

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

Especifica si la función tendrá una o más de las siguientes opciones.

ENCRIPTACIÓN

Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

Indica que el motor de base de datos cifra las columnas de vista de catálogo que contienen el texto de la ALTER FUNCTION instrucción . El uso de ENCRYPTION impide que la función se publique como parte de la replicación de SQL Server. ENCRYPTION no se puede especificar para funciones CLR.

SCHEMABINDING

Especifica que la función está enlazada a los objetos de base de datos a los que hace referencia. Cuando se especifica SCHEMABINDING, los objetos base no se pueden modificar de una forma que afecte a la definición de la función. 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.

El enlace de la función a los objetos a los que hace referencia solamente se quita cuando se ejecuta una de estas acciones:

  • Se quita la función.

  • La función se modifica con la instrucción ALTER sin especificar la opción SCHEMABINDING.

Para obtener una lista de las condiciones que se deben cumplir para poder enlazar un esquema a la función, vea CREATE FUNCTION (Transact-SQL).

DEVUELVE NULL EN UNA ENTRADA NULA | LLAMADO EN UNA ENTRADA NULA

Especifica el OnNULLCall atributo de una función con valores escalares. Si no se especifica, CALLED ON NULL INPUT está implícito de forma predeterminada. Esto significa que el cuerpo de la función se ejecuta incluso si NULL se pasa como argumento.

Si RETURNS NULL ON NULL INPUT se especifica en una función CLR, indica que SQL Server puede devolver NULL cuando cualquiera de los argumentos que recibe es NULL, sin invocar realmente el cuerpo de la función. Si el método especificado en <method_specifier> ya tiene un atributo personalizado que indica RETURNS NULL ON NULL INPUT, pero la ALTER FUNCTION instrucción indica CALLED ON NULL INPUT, la ALTER FUNCTION instrucción tiene prioridad. No se puede especificar el OnNULLCall atributo para las funciones con valores de tabla CLR.

Cláusula EXECUTE AS

Especifica el contexto de seguridad en el que se ejecuta la función definida por el usuario. Por lo tanto, es posible controlar la cuenta de usuario que utiliza SQL Server para validar los permisos en los objetos de base de datos a los que hace referencia la función.

Nota:

EXECUTE AS no se puede especificar para las funciones insertadas definidas por el usuario.

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

< >column_definition ::=

Define el tipo de datos de tabla. La declaración de tabla incluye definiciones de columna y restricciones. En las funciones CLR, solo se pueden especificar column_name y data_type.

column_name

Nombre de una columna de la tabla. Los nombres de columna se deben ajustar a las reglas para los identificadores y deben ser únicos en la tabla. column_name puede tener entre 1 y 128 caracteres.

data_type

Especifica el tipo de datos de la columna. En las funciones Transact-SQL, se permiten todos los tipos de datos, incluidos los tipos CLR definidos por el usuario, a excepción de 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-SQL o CLR.

DEFAULT constant_expression

Especifica el valor suministrado para la columna cuando no se ha especificado explícitamente un valor durante una inserción. constant_expression es una constante, NULLo un valor de función del sistema. Se pueden aplicar definiciones con el valor DEFAULT a cualquier columna, excepto las que incluyen la propiedad IDENTITY. No se puede especificar DEFAULT para las funciones CLR con valores de tabla.

COTEJAR collation_name

Especifica la intercalación de la columna. Si no se especifica, se asigna a la columna la intercalación predeterminada de la base de datos. El nombre de intercalación puede ser un nombre de intercalación de Windows o un nombre de intercalación de SQL. Para obtener una lista de y más información, vea Nombre de intercalación de Windows y Nombre de intercalación de SQL Server.

La cláusula COLLATE se puede usar para cambiar únicamente las intercalaciones de las columnas con tipos de datos char, varchar, nchar y nvarchar.

No se puede especificar COLLATE para las funciones con valores de tabla CLR.

ROWGUIDCOL

Indica que la nueva columna es una columna de identificador único global de fila. Solo se puede designar una columna uniqueidentifier por tabla como columna ROWGUIDCOL . La propiedad ROWGUIDCOL solo se puede asignar a una columna uniqueidentifier .

La propiedad ROWGUIDCOL no exige que los valores almacenados en la columna sean únicos. Del mismo modo, tampoco genera automáticamente valores para nuevas filas insertadas en la tabla. Para generar valores únicos para cada columna, utilice la NEWID función on INSERT statements. Se puede especificar un valor predeterminado; sin embargo, NEWID no se puede especificar como valor predeterminado.

IDENTIDAD

Indica que la nueva columna es una columna de identidad. Cuando se agrega una nueva fila a la tabla, SQL Server proporciona un valor incremental único para la columna. Las columnas de identidad se utilizan normalmente junto con las restricciones PRIMARY KEY como identificadores de fila exclusivos de la tabla. La propiedad IDENTITY se puede asignar a columnas tinyint, smallint, int, bigint, decimal(p,0) o numeric(p,0) . Solo se puede crear una columna de identidad para cada tabla. Las restricciones DEFAULT y los valores predeterminados enlazados no se pueden utilizar en las columnas de identidad. Se debe especificar los dos argumentos, seed e increment, o ninguno. Si no se especifica ninguno, el valor predeterminado es (1,1).

No se puede especificar IDENTITY para las funciones CLR con valores de tabla.

semilla

Valor entero que se asignará a la primera fila de la tabla.

incremento

Valor entero que se va a agregar al valor de inicialización de las filas sucesivas de la tabla.

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

Define la restricción para la columna o tabla especificada. Para las funciones CLR, el único tipo de restricción permitido es NULL. No se permiten las restricciones con nombre.

NULL | NO NULL

Determina si se permiten valores NULL en la columna. NULL no es estrictamente una restricción, pero se puede especificar igual que NOT NULL. NOT NULL no se puede especificar para funciones con valores de tabla CLR.

CLAVE PRINCIPAL

Restricción que aplica la integridad de la entidad para una columna especificada a través de un índice único. 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. No se puede especificar PRIMARY KEY para las funciones CLR con valores de tabla.

ÚNICO

Restricción que proporciona integridad de entidad para una columna o columnas especificadas a través de un índice único. Las tablas pueden tener varias restricciones UNIQUE. No se puede especificar UNIQUE para las funciones CLR con valores de tabla.

AGRUPADO | NO AGRUPADO

Indica que se ha creado un índice clúster o no clúster para la restricción PRIMARY KEY o UNIQUE. Las restricciones PRIMARY KEY utilizan CLUSTERED y las restricciones UNIQUE, NONCLUSTERED.

CLUSTERED solamente se puede especificar para una restricción. Si se especifica CLUSTERED para una restricción UNIQUE y también se especifica una restricción PRIMARY KEY, esta última utilizará NONCLUSTERED.

No se pueden especificar CLUSTERED y NONCLUSTERED para las funciones CLR con valores de tabla.

COMPROBAR

Restricción que aplica la integridad del dominio limitando los valores posibles que se pueden especificar en una columna o columnas. No se pueden especificar restricciones CHECK para las funciones CLR con valores de tabla.

logical_expression

Es una expresión lógica que devuelve TRUE o FALSE.

< >computed_column_definition::=

Especifica una columna calculada. Para obtener más información sobre las columnas calculadas, consulte CREATE TABLE (Transact-SQL).

column_name

Nombre de la columna calculada.

computed_column_expression

Expresión que define el valor de una columna calculada.

< >index_option::=

Especifica las opciones de índice para el índice PRIMARY KEY o UNIQUE. Para más información sobre las opciones de índice, vea CREATE INDEX (Transact-SQL).

PAD_INDEX = { ON | OFF }

Especifica el relleno del índice. El valor predeterminado es OFF.

FILLFACTOR = fillfactor

Especifica un porcentaje que indica cuánto debe llenar el Motor de base de datos el nivel hoja de cada página de índice durante la creación o modificación de los índices. fillfactor debe ser un valor entero comprendido entre 1 y 100. El valor predeterminado es 0.

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. La opción IGNORE_DUP_KEY se aplica solamente a operaciones de inserción realizadas tras crear o volver a generar el índice. El valor predeterminado es OFF.

STATISTICS_NORECOMPUTE = { ON | OFF }

Especifica si se vuelven a calcular las estadísticas de distribución. El valor predeterminado es OFF.

ALLOW_ROW_LOCKS = { ON | OFF }

Especifica si se permiten los bloqueos de fila. El valor predeterminado es ON.

ALLOW_PAGE_LOCKS = { ON | OFF }

Especifica si se permiten bloqueos de página. El valor predeterminado es ON.

Observaciones

No es posible utilizar ALTER FUNCTION para cambiar una función escalar por una función con valores de tabla, ni viceversa. Tampoco es posible utilizar ALTER FUNCTION para cambiar una función insertada por una función de múltiples instrucciones o viceversa. No se puede utilizar ALTER FUNCTION para cambiar una función Transact-SQL por una función CLR o viceversa.

Las siguientes instrucciones de Service Broker no se pueden incluir en la definición de una función Transact-SQL definida por el usuario:

  • BEGIN DIALOG CONVERSATION
  • END CONVERSATION
  • GET CONVERSATION GROUP
  • MOVE CONVERSATION
  • RECEIVE
  • SEND

Permisos

Requiere el permiso ALTER para la función o para el esquema. Si la función especifica un tipo definido por el usuario, requiere el permiso EXECUTE para ese tipo.

En Microsoft Fabric, los miembros de los roles Administrador, Miembro y Colaborador del área de trabajo de Fabric pueden crear funciones.