ALTER FUNCTION (Transact-SQL)

適用于:SQL Server Azure SQL 資料庫不支援Azure Synapse Analytics Analytics Platform System (PDW)

變更先前藉由執行 CREATE FUNCTION 語句所建立的現有 Transact-SQL 或 CLR 函式,而不需要變更許可權,也不會影響任何相依函式、預存程式或觸發程式。

主題連結圖示Transact-SQL 語法慣例

語法

-- 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 ]   
}  

引數

schema_name
這是使用者定義函數所屬的結構描述名稱。

function_name
這是要變更的使用者定義函數。

注意

即使沒有指定參數,函數名稱後面仍需要括號。

@parameter_name
這是使用者定義函數中的參數。 您可以宣告一個或多個參數。

函數最多可以有 2,100 個參數。 除非定義了參數的預設值,否則在執行函數時,使用者必須提供每個已宣告之參數的值。

使用 "at" 記號 ( @ ) 當作第一個字元來指定參數名稱。 參數名稱必須符合識別碼的規則。 對函數而言,參數必須是本機參數;相同的參數名稱可以用在其他函數中。 參數只能取代常數,不能用來取代資料表名稱、資料行名稱或其他資料庫物件的名稱。

注意

當在預存程序或使用者自訂函數中傳遞參數時,或在批次陳述式中宣告和設定變數時,會忽略 ANSI_WARNINGS。 例如,如果將變數定義為 char(3) ,然後設定為大於三個字元的值,資料就會被截斷成定義的大小,而 INSERT 或 UPDATE 陳述式會執行成功。

[ type_schema_name。 ] parameter_data_type
這是參數資料類型,對於其所屬的結構描述而言為選擇性。 針對 Transact-SQL 函式,除了 timestamp 資料類型以外,允許所有資料類型,包括 CLR 使用者定義型別。 就 CLR 函式而言,所有資料類型 (包括 CLR 使用者定義型別) 都是允許的資料類型,但 textntextimagetimestamp 資料類型除外。 在 Transact-SQL 或 CLR 函式中,不可將非calar 類型 資料 指標和 資料表 指定為參數資料類型。

如果未指定type_schema_name,SQL Server Database Engine 會依下列順序尋找parameter_data_type

  • 內含 SQL Server 系統資料類型的結構描述。

  • 目前資料庫中之目前使用者的預設結構描述。

  • 目前資料庫中的 dbo 結構描述。

[ =default ]
這是參數的預設值。 如果已定義 default 值,則不需為該參數指定值,即可執行函式。

注意

您可以針對 CLR 函式指定預設參數值,但 varchar(max)varbinary(max) 資料類型除外。

如果函數的參數有預設值,則必須在呼叫函數來擷取該預設值時指定關鍵字 DEFAULT。 這個行為與使用預存程序中具有預設值的參數不一樣,因為在預存程序中,省略參數也意味著使用預設值。

return_data_type
這是純量使用者定義函數的傳回值。 針對 Transact-SQL 函式,除了 timestamp 資料類型以外,允許所有資料類型,包括 CLR 使用者定義型別。 就 CLR 函式而言,所有資料類型 (包括 CLR 使用者定義型別) 都是允許的資料類型,但 textntextimagetimestamp 資料類型除外。 在 Transact-SQL 或 CLR 函式中,不可將非calar 類型 資料指標資料表 指定為傳回資料類型。

function_body
指定一系列 Transact-SQL 語句,這些語句一起不會產生副作用,例如修改資料表、定義函式的值。 function_body 僅用於純量函式和多重陳述式資料表值函式中。

在純量函式中, function_body 是一系列 Transact-SQL 語句,一起評估為純量值。

在多重語句資料表值函式中, function_body 是一系列的 Transact-SQL 語句,可填入 TABLE 傳回變數。

scalar_expression
指定純量函數傳回純量值。

TABLE
指定資料表值函式的傳回值是資料表。 只有常數和 @local_variables可以傳遞至資料表值函式。

在內嵌資料表值函式中,TABLE 傳回值是利用單一 SELECT 陳述式所定義。 內嵌函數沒有相關聯的傳回變數。

在多重語句資料表值函式中,return_variable是 TABLE 變數, @ 用來儲存和累積應該傳回為函式值的資料列。 @return_variable 只能針對 Transact-SQL 函式指定,而不能針對 CLR 函式指定。

select-stmt
這是單一 SELECT 陳述式,可定義嵌入資料表值函式的傳回值。

EXTERNAL NAME <method_specifier assembly_name.class> _name。method_name
適用于:SQL Server 2008 和更新版本。

指定繫結函數之組件的方法。 assembly_name必須符合目前資料庫中SQL Server中現有的元件,並具有可見度。class_name必須是有效的SQL Server識別碼,而且必須以元件中的類別的形式存在。 如果該類別具有命名空間限定的名稱,且該名稱使用句號 ( . ) 來分隔命名空間的各個部分,您就必須使用方括弧 ( [] ) 或引號 ( "" ) 來分隔類別名稱。 method_name必須是有效的SQL Server識別碼,而且必須以指定類別中的靜態方法的形式存在。

注意

根據預設,SQL Server無法執行 CLR 程式碼。 您可以建立、修改和卸載參考 Common Language Runtime 模組的資料庫物件;不過,除非您啟用clr enabled 選項,否則無法在 SQL Server中執行這些參考。 若要啟用這個選項,請使用 sp_configure

注意

自主資料庫無法使用這個選項。

<>table_type_definition ({< column_definition column_constraint | ><><>computed_column_definition } [ < table_constraint > ] [ ...n ])
定義 Transact-SQL 函式的資料表資料類型。 資料表宣告包括資料行定義和資料行或資料表條件約束。

<clr_table_type_definition > ( { column_name**data_type } [ ...n ] ) 適用于:SQL Server 2008 和更新版本,SQL Database (某些區域中的預覽) 。

定義 CLR 函數的資料表資料類型。 資料表宣告只包含資料行名稱和資料類型。

NULL|NOT NULL
只有針對原生編譯的純量使用者定義函式才支援。 如需詳細資訊,請參閱記憶體內部 OLTP 的純量使用者定義函數

NATIVE_COMPILATION
指出使用者定義函式是否為原生編譯函式。 此引數是原生編譯之純量使用者定義函式的必要引數。

NATIVE_COMPILATION 引數在您 ALTER 函式時為必要項目,且只能在函式是透過 NATIVE_COMPILATION 引數建立時才能使用。

BEGIN ATOMIC WITH
只有針對原生編譯的純量使用者定義函式才支援,並且為必要項目。 如需詳細資訊,請參閱 Atomic Blocks

SCHEMABINDING
SCHEMABINDING 是原生編譯之純量使用者定義函式的必要引數。

<>function_option::= 和 < clr_function_option > ::=

指定函數必須有下列其中一個或多個選項。

ENCRYPTION
適用于:SQL Server 2008 和更新版本。

指出 Database Engine 會加密包含 ALTER FUNCTION 語句文字的目錄檢視資料行。 使用 ENCRYPTION 可防止函式發佈為SQL Server複寫的一部分。 無法為 CLR 函數指定 ENCRYPTION。

SCHEMABINDING
指定函數必須繫結到它所參考的資料庫物件。 當指定 SCHEMABINDING 時,無法依照會影響函數定義的方式來修改基底物件。 您必須先修改或卸除函數定義,才能移除對於所要修改物件的相依性。

只有在下發生下列其中一個動作時,才會移除函數與其參考的物件之間的繫結:

  • 已卸除這個函數。

  • 您可以利用未指定 SCHEMABINDING 選項的 ALTER 陳述式來修改函數。

如需在函式可以系結架構之前必須符合的條件清單,請參閱 CREATE FUNCTION (Transact-SQL)

RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT
指定純量值函式的 OnNULLCall 屬性。 若未指定,預設情況下意味著 CALLED ON NULL INPUT。 這表示,即使傳遞 NULL 做為引數,函數主體仍會執行。

如果在 CLR 函式中指定 RETURNS Null ON Null INPUT,則表示當接收的任何引數為 Null 時,SQL Server可以傳回 Null,而不會實際叫用函式主體。 如果method_specifier > 中指定的 < 方法已經有自訂屬性,表示 RETURNS Null ON Null INPUT,但 ALTER FUNCTION 語句表示 CALLED ON Null INPUT,ALTER FUNCTION 語句會優先使用。 無法為 CLR 資料表值函式指定 OnNULLCall 屬性。

EXECUTE AS 子句
指定執行使用者定義函數時所在的安全性內容。 因此,您可以控制哪些使用者帳戶SQL Server用來驗證函式所參考之任何資料庫物件的許可權。

注意

無法為內嵌使用者定義函數指定 EXECUTE AS。

如需詳細資訊,請參閱 EXECUTE AS 子句 (Transact-SQL)

<>column_definition ::=

定義資料表資料類型。 資料表宣告包括資料行定義和條件約束。 針對 CLR 函式,只能指定 column_namedata_type

column_name
這是資料表中的資料行名稱。 資料行名稱必須符合識別碼規則,在資料表中也必須是唯一的。 column_name 可由 1 到 128 個字元組成。

data_type
指定資料行資料類型。 對於 Transact-SQL 函式,除了 時間戳記之外,允許所有資料類型,包括 CLR 使用者定義型別。 針對 CLR 函式,除了textNtextimagecharVarchar、Varchar (max) timestamp以外,允許所有資料類型,包括 CLR 使用者定義型別。在 Transact-SQL 或 CLR 函式中,無法將非可調整類型資料指標指定為數據行資料類型。

DEFAULT constant_expression
指定在插入期間未明確提供值時,提供給資料行的值。 constant_expression 是常數、NULL 或系統函式值。 除了含有 IDENTITY 屬性的資料行之外,任何資料行都可以套用 DEFAULT 定義。 無法為 CLR 資料表值函式指定 DEFAULT。

COLLATE collation_name
指定資料行的定序。 若未指定,就會將資料庫的預設定序指派給資料行。 定序名稱可以是 Windows 定序名稱或 SQL 定序名稱。 如需和詳細資訊的清單,請參閱Windows 定序名稱 (Transact-SQL) SQL Server定序名稱 (Transact-SQL)

COLLATE 子句只能用來變更 charvarcharncharnvarchar 資料類型之資料行的定序。

無法為 CLR 資料表值函式指定 COLLATE。

ROWGUIDCOL
指出新資料行是一個資料列全域唯一識別碼資料行。 每個資料表只能有一個 uniqueidentifier 資料行指定為 ROWGUIDCOL 資料行。 ROWGUIDCOL 屬性只能指派給 uniqueidentifier 資料行。

ROWGUIDCOL 屬性不會強制執行資料行中所儲存之值的唯一性。 它也不會自動為插入資料表中的新資料列產生值。 若要為每個資料行產生唯一值,請在 INSERT 陳述式上使用 NEWID 函數。 可以指定預設值;不過,NEWID 不能指定為預設值。

IDENTITY
指出新資料行是識別欄位。 將新資料列新增至資料表時,SQL Server為數據行提供唯一的累加值。 識別欄位通常用來搭配 PRIMARY KEY 條件約束一起使用,當做資料表的唯一資料列識別碼。 可以將 IDENTITY 屬性指派給 tinyintsmallintintbigintdecimal(p,0)numeric(p,0) 資料行。 每份資料表都只能建立一個識別欄位。 繫結的預設值和 DEFAULT 條件約束無法搭配識別欄位使用。 您必須同時指定 seedincrement,或兩者都不指定。 如果同時不指定這兩者,預設值便是 (1,1)。

無法為 CLR 資料表值函式指定 IDENTITY。

seed
這是要指派給資料表中第一個資料列的整數值。

increment
這是要新增至資料表中後續資料列之 seed 值的整數值。

<>column_constraint ::= 和 < table_constraint > ::=

定義指定之資料行或資料表的條件約束。 就 CLR 函數而言,唯一允許的條件約束類型是 NULL。 不允許具名條件約束。

NULL | NOT NULL
判斷資料行中是否允許 Null 值。 嚴格來說,NULL 並不算是條件約束,但是您可以如同指定 NOT NULL 一樣加以指定。 無法為 CLR 資料表值函式指定 NOT NULL。

PRIMARY KEY
這是一項條件約束,它利用唯一索引強制執行指定之資料行的實體完整性。 在資料表值使用者定義函數中,PRIMARY KEY 條件約束只能建立在每份資料表的一個資料行上。 無法為 CLR 資料表值函式指定 PRIMARY KEY。

UNIQUE
這是一項條件約束,它透過唯一索引為指定的一個或多個資料行提供實體完整性。 一份資料表可以有多個 UNIQUE 條件約束。 無法為 CLR 資料表值函式指定 UNIQUE。

CLUSTERED | NONCLUSTERED
指出針對 PRIMARY KEY 或 UNIQUE 條件約束建立叢集或非叢集索引。 PRIMARY KEY 條件約束使用 CLUSTERED,UNIQUE 條件約束則使用 NONCLUSTERED。

只能為一個條件約束指定 CLUSTERED。 如果針對 UNIQUE 條件約束指定 CLUSTERED,且指定了 PRIMARY KEY 條件約束,則 PRIMARY KEY 會使用 NONCLUSTERED。

無法為 CLR 資料表值函式指定 CLUSTERED 和 NONCLUSTERED。

CHECK
這是一個條件約束,藉由限制可能輸入一個或多個資料行的值,強制執行範圍完整性。 無法為 CLR 資料表值函式指定 CHECK 條件約束。

logical_expression
這是一個傳回 TRUE 或 FALSE 的邏輯運算式。

<computed_column_definition > ::=

指定計算資料行。 如需計算資料行的詳細資訊,請參閱 CREATE TABLE (Transact-SQL)

column_name
這是計算資料行的名稱。

computed_column_expression
這是定義計算資料行值的運算式。

<>index_option::=

指定 PRIMARY KEY 或 UNIQUE 索引的索引選項。 如需索引選項的詳細資訊,請參閱 CREATE INDEX (Transact-SQL)

PAD_INDEX = { ON | OFF }
指定索引填補。 預設值為 OFF。

FILLFACTOR = fillfactor
指定百分比,指出 Database Engine 在索引建立或變更期間,每個索引頁面的分葉層級應該有多滿。 fillfactor 必須是 1 到 100 之間的整數值。 預設值是 0。

IGNORE_DUP_KEY = { ON | OFF }
指定當插入作業嘗試將重複的索引鍵值插入唯一索引時所產生的錯誤回應。 IGNORE_DUP_KEY 選項只適用於在建立或重建索引之後所發生的插入作業。 預設值為 OFF。

STATISTICS_NORECOMPUTE = { ON | OFF }
指定是否要重新計算散發統計資料。 預設值為 OFF。

ALLOW_ROW_LOCKS = { ON | OFF }
指定是否允許資料列鎖定。 預設值是 ON。

ALLOW_PAGE_LOCKS = { ON | OFF }
指定是否允許頁面鎖定。 預設值是 ON。

備註

ALTER FUNCTION 不能用來將純量值函式變更為資料表值函式,反之亦然。 另外,ALTER FUNCTION 也不能用來將內嵌函數變更為多重陳述式函數,反之亦然。 ALTER FUNCTION 無法用來將 Transact-SQL 函式變更為 CLR 函式,反之亦然。

下列 Service Broker 陳述式不能併入 Transact-SQL 使用者定義函數的定義中:

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

權限

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

另請參閱

CREATE FUNCTION (Transact-SQL)
DROP FUNCTION (Transact-SQL)
對發行集資料庫進行結構描述變更
EVENTDATA (Transact-SQL)