Sdílet prostřednictvím


Úprava uživatelem definovaných funkcí

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Uživatelem definované funkce v SQL Serveru můžete upravit pomocí aplikace SQL Server Management Studio nebo jazyka Transact-SQL. Úprava uživatelem definovaných funkcí, jak je popsáno níže, nezmění oprávnění funkcí ani nebude mít vliv na závislé funkce, uložené procedury ani triggery.

Omezení a restrikce

FUNKCI ALTER FUNCTION nelze použít k provedení žádné z následujících akcí:

  • Změňte skalární funkci na funkci s hodnotou tabulky nebo naopak.

  • Změňte inline funkci na funkci s více příkazy nebo naopak.

  • Změňte funkci Transact-SQL na funkci CLR nebo naopak.

Dovolení

Vyžaduje oprávnění ALTER pro funkci nebo ve schématu. Pokud funkce určuje uživatelem definovaný typ, vyžaduje oprávnění EXECUTE u typu.

Použití aplikace SQL Server Management Studio

  1. Vyberte znaménko plus vedle databáze obsahující funkci, kterou chcete upravit.

  2. Vyberte znaménko plus vedle složky Programovatelnost.

  3. Vyberte znaménko plus vedle složky, která obsahuje funkci, kterou chcete upravit:

    • Tabulková funkce

    • Skalární funkce

    • Agregační funkce

  4. Klikněte pravým tlačítkem myši na funkci, kterou chcete upravit, a vyberte Upravit.

  5. V okně dotazu proveďte potřebné změny příkazu ALTER FUNCTION.

  6. V nabídce Soubor vyberte Uložitfunction_name.

Použití Transact-SQL

  1. V Průzkumníku objektůpřipojte se k instanci modulu databáze.

  2. Na panelu Standard vyberte Nový dotaz.

  3. Zkopírujte a vložte následující příklady do okna dotazu a vyberte Spustit.

    Následující ukázka kódu změní skalární hodnotu funkce.

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

    Následující vzorový kód změní funkci s hodnotou tabulky.

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

Viz také