Modificación de funciones definidas por el usuario

Se aplica a: SQL Server (todas las versiones compatibles) Azure SQL Managed Instance Database Azure SQL

Puede modificar las funciones definidas por el usuario en SQL Server mediante SQL Server Management Studio o Transact-SQL. La modificación de funciones definidas por el usuario como se describe a continuación no cambiará los permisos de las funciones, ni afectará a ninguna función dependiente, procedimientos almacenados ni desencadenadores.

Limitaciones y restricciones

ALTER FUNCTION no se puede usar para realizar ninguna de las acciones siguientes:

  • Cambiar una función escalar a una función con valores de tabla, o viceversa.

  • Cambiar una función insertada a una función de múltiples instrucciones, o viceversa.

  • Cambiar una función de Transact-SQL en una función CLR, o viceversa.

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.

Use SQL Server Management Studio

  1. Seleccione el signo más situado junto a la base de datos que contiene la función que desea modificar.

  2. Seleccione el signo más situado junto a la carpeta Programación .

  3. Seleccione el signo más situado junto a la carpeta que contiene la función que desea modificar:

    • Table-valued Function

    • Función con valor escalar

    • Función de agregado

  4. Haga clic con el botón derecho en la función que quiere modificar y seleccione Modificar.

  5. En la ventana de consulta, realice los cambios necesarios en la instrucción ALTER FUNCTION.

  6. En el menú Archivo , seleccione Guardarfunction_name.

Uso de Transact-SQL

  1. En Explorador de objetos, conéctese a una instancia del motor de base de datos.

  2. En la barra Estándar, seleccione Nueva consulta.

  3. Copie y pegue los ejemplos siguientes en la ventana de consulta y seleccione Ejecutar.

    En el ejemplo de código siguiente se modifica una función escalar.

    -- Scalar-Valued Function
    USE [AdventureWorks2012]
    GO
    ALTER FUNCTION [dbo].[ufnGetAccountingEndDate]()
    RETURNS [datetime]
    AS
    BEGIN
        RETURN DATEADD(millisecond, -2, CONVERT(datetime, '20040701', 112));
    END;
    

    En el ejemplo de código siguiente se modifica una función con valores de tabla.

    -- Table-Valued Function
    USE [AdventureWorks2012]
    GO
    ALTER FUNCTION [dbo].[ufnGetContactInformation](@PersonID int)
    RETURNS @retContactInformation TABLE
    (
        -- Columns returned by the function
        [PersonID] int NOT NULL,
        [FirstName] [nvarchar](50) NULL,
        [LastName] [nvarchar](50) NULL,
        [JobTitle] [nvarchar](50) NULL,
        [BusinessEntityType] [nvarchar](50) NULL
    )
    AS
    -- Returns the first name, last name, job title and business entity type for the specified contact.
    -- Since a contact can serve multiple roles, more than one row may be returned.
    BEGIN
    IF @PersonID IS NOT NULL
    BEGIN
         IF EXISTS(SELECT * FROM [HumanResources].[Employee] e
         WHERE e.[BusinessEntityID] = @PersonID)
         INSERT INTO @retContactInformation
              SELECT @PersonID, p.FirstName, p.LastName, e.[JobTitle], 'Employee'
              FROM [HumanResources].[Employee] AS e
              INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = e.[BusinessEntityID]
              WHERE e.[BusinessEntityID] = @PersonID;
    
         IF EXISTS(SELECT * FROM [Purchasing].[Vendor] AS v
         INNER JOIN [Person].[BusinessEntityContact] bec ON bec.[BusinessEntityID] = v.[BusinessEntityID]
         WHERE bec.[PersonID] = @PersonID)
         INSERT INTO @retContactInformation
              SELECT @PersonID, p.FirstName, p.LastName, ct.[Name], 'Vendor Contact'
              FROM [Purchasing].[Vendor] AS v
              INNER JOIN [Person].[BusinessEntityContact] bec ON bec.[BusinessEntityID] = v.[BusinessEntityID]
              INNER JOIN [Person].ContactType ct ON ct.[ContactTypeID] = bec.[ContactTypeID]
              INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = bec.[PersonID]
              WHERE bec.[PersonID] = @PersonID;
    
         IF EXISTS(SELECT * FROM [Sales].[Store] AS s
         INNER JOIN [Person].[BusinessEntityContact] bec ON bec.[BusinessEntityID] = s.[BusinessEntityID]
         WHERE bec.[PersonID] = @PersonID)
         INSERT INTO @retContactInformation
              SELECT @PersonID, p.FirstName, p.LastName, ct.[Name], 'Store Contact'
              FROM [Sales].[Store] AS s
              INNER JOIN [Person].[BusinessEntityContact] bec ON bec.[BusinessEntityID] = s.[BusinessEntityID]
              INNER JOIN [Person].ContactType ct ON ct.[ContactTypeID] = bec.[ContactTypeID]
              INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = bec.[PersonID]
              WHERE bec.[PersonID] = @PersonID;
    
         IF EXISTS(SELECT * FROM [Person].[Person] AS p
         INNER JOIN [Sales].[Customer] AS c ON c.[PersonID] = p.[BusinessEntityID]
         WHERE p.[BusinessEntityID] = @PersonID AND c.[StoreID] IS NULL)
         INSERT INTO @retContactInformation
              SELECT @PersonID, p.FirstName, p.LastName, NULL, 'Consumer'
              FROM [Person].[Person] AS p
              INNER JOIN [Sales].[Customer] AS c ON c.[PersonID] = p.[BusinessEntityID]
              WHERE p.[BusinessEntityID] = @PersonID AND c.[StoreID] IS NULL;
         END
    RETURN;
    END;
    

Vea también