共用方式為


修改使用者定義函數

您可以透過使用 SQL Server Management Studio 或 Transact-SQL,修改 SQL Server 2012 中的使用者定義函數。 如下述修改使用者定義函數不會變更函數的權限,也不會影響任何相依函數、預存程序或觸發程序。

本主題內容

  • 開始之前:

    限制事項

    安全性

  • 使用下列方式修改使用者定義函數:

    SQL Server Management Studio

    Transact-SQL

開始之前

限制事項

ALTER FUNCTION 不能用於執行以下任何動作:

  • 將純量值函式變更為資料表值函式,反之亦然。

  • 將內嵌函數變更為多重陳述式函數,反之亦然。

  • 將 Transact-SQL 函數變更為 CLR 函數,反之亦然。

安全性

權限

需要函數或結構描述的 ALTER 權限。 如果函數指定使用者定義類型,則需要該類型上的 EXECUTE 權限。

搭配回到頁首連結使用的箭頭圖示[Top]

使用 SQL Server Management Studio

若要修改使用者定義函數

  1. 按一下包含要修改之函數的資料庫旁邊的加號。

  2. 按一下 [可程式性] 資料夾旁的加號。

  3. 按一下包含要修改之函數的資料夾旁邊的加號:

    • 資料表值函式

    • 純量值函式

    • 彙總函式

  4. 以滑鼠右鍵按一下您要修改的函數,然後選取 [修改]

  5. 在查詢視窗中,對 ALTER FUNCTION 陳述式進行必要的變更。

  6. 按一下 [檔案] 功能表上的 [儲存 function_name]

搭配回到頁首連結使用的箭頭圖示[Top]

使用 Transact-SQL

若要修改使用者定義函數

  1. [物件總管] 中,連接到 Database Engine 的執行個體。

  2. 在標準列上,按一下 [新增查詢]

  3. 將下列範例複製並貼到查詢視窗中,然後按一下 [執行]

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

如需詳細資訊,請參閱<ALTER FUNCTION (Transact-SQL)>。

搭配回到頁首連結使用的箭頭圖示[Top]