Modifier les fonctions définies par l’utilisateur

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Vous pouvez modifier des fonctions définies par l’utilisateur dans SQL Server à l’aide de SQL Server Management Studio ou de Transact-SQL. La modification des fonctions définies par l’utilisateur comme décrit ci-dessous ne modifie pas les autorisations des fonctions et n’affecte pas les fonctions dépendantes, les procédures stockées ou les déclencheurs.

Limitations et restrictions

ALTER FUNCTION ne peut pas être utilisé pour effectuer l’une des actions suivantes :

  • Convertir une fonction scalaire en fonction table, et inversement.

  • Convertir une fonction inline en fonction à instructions multiples, et inversement.

  • Convertir une fonction Transact-SQL en fonction CLR, et inversement.

Autorisations

Nécessite l'autorisation ALTER sur la fonction ou sur le schéma. Si la fonction spécifie un type défini par l'utilisateur, elle requiert l'autorisation EXECUTE sur le type.

Utiliser SQL Server Management Studio

  1. Sélectionnez le signe plus en regard de la base de données qui contient la fonction que vous souhaitez modifier.

  2. Sélectionnez le signe plus en regard du dossier Programmability .

  3. Sélectionnez le signe plus en regard du dossier qui contient la fonction que vous souhaitez modifier :

    • Table-valued Function

    • Fonction scalaire

    • Fonction d'agrégation

  4. Cliquez avec le bouton droit sur la fonction à modifier, puis cliquez sur Modifier.

  5. Dans la fenêtre de requête, apportez les modifications nécessaires à l'instruction ALTER FUNCTION.

  6. Dans le menu Fichier , sélectionnez Enregistrerfunction_name.

Utiliser Transact-SQL

  1. Dans l’Explorateur d’objets, connectez-vous à une instance du moteur de base de données.

  2. Dans la barre d’outils standard, sélectionnez Nouvelle requête.

  3. Copiez et collez les exemples suivants dans la fenêtre de requête, puis sélectionnez Exécuter.

    L’exemple de code suivant modifie une fonction scalaire.

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

    L’exemple de code suivant modifie une fonction table.

    -- Table-Valued Function
    USE [AdventureWorks2022]
    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;
    

Voir aussi