ALTER FUNCTION (Transact-SQL)

更改先前通过执行 CREATE FUNCTION 语句创建的现有 Transact-SQL 或 CLR 函数,但不更改权限,也不影响任何相关的函数、存储过程或触发器。

主题链接图标Transact-SQL 语法约定

语法

Scalar Functions
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
[ ; ]

Inline Table-valued Functions
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 [ ) ]
[ ; ]

Multistatement Table-valued Functions
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
[ ; ]

CLR Functions
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>
[ ; ]

<method_specifier>::=
        assembly_name.class_name.method_name

Function Options
<function_option>::= 
{
    [ ENCRYPTION ]
  | [ SCHEMABINDING ]
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
  | [ EXECUTE_AS_Clause ]
}

<clr_function_option>::=
}
    [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
  | [ EXECUTE_AS_Clause ]
}

Table Type Definitions
<table_type_definition>:: = 
( { <column_definition> <column_constraint> 
  | <computed_column_definition> } 
        [ <table_constraint> ] [ ,...n ]
) 

<clr_table_type_definition>:: = 
( { column_name data_type } [ ,...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 } 
}

参数

  • schema_name
    用户定义函数所属的架构的名称。
  • function_name
    要更改的用户定义函数。

    ms186967.note(zh-cn,SQL.90).gif注意:
    即使未指定参数,函数名称后也需要加上括号。
  • **@**parameter_name
    用户定义函数中的参数。可声明一个或多个参数。

    一个函数最多可以有 1,024 个参数。执行函数时,如果未定义参数的默认值,则用户必须提供每个已声明参数的值。

    通过将 at 符号 (@) 用作第一个字符来指定参数名称。参数名称必须符合有关标识符的规则。参数是对应于函数的局部参数;其他函数中可使用相同的参数名称。参数只能代替常量,而不能用于代替表名、列名或其他数据库对象的名称。

    ms186967.note(zh-cn,SQL.90).gif注意:
    在存储过程或用户定义函数中传递参数时,或在批语句中声明和设置变量时,不会遵守 ANSI_WARNINGS。例如,如果将变量定义为 char(3) 类型,然后将其值设置为多于三个字符,则数据将截断为定义大小,并且 INSERT 或 UPDATE 语句可以成功执行。
  • [ type_schema_name. ] parameter_data_type
    参数的数据类型及其所属的架构(可选)。对于 Transact-SQL 函数,可以使用除 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。对于 CLR 函数,可以使用除 textntextimagetimestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。不能将非标量类型 cursortable 指定为 Transact-SQL 函数或 CLR 函数中的参数数据类型。

    如果未指定 type_schema_name,则 SQL Server 2005 数据库引擎将按以下顺序查找 parameter_data_type

    • 包含 SQL Server 系统数据类型名称的架构。
    • 当前数据库中当前用户的默认架构。
    • 当前数据库中的 dbo 架构。
  • [ **=**default ]
    参数的默认值。如果定义了 default 值,则无需指定此参数的值即可执行函数。

    ms186967.note(zh-cn,SQL.90).gif注意:
    可以为除 varchar(max)varbinary(max) 数据类型之外的 CLR 函数指定默认参数值。

    如果函数的参数有默认值,则调用函数来检索默认值时必须指定 DEFAULT 关键字。此行为与在存储过程中使用具有默认值的参数不同,在后一种情况下,不提供参数同样意味着使用默认值。

  • return_data_type
    标量用户定义函数的返回值。对于 Transact-SQL 函数,可以使用除 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。对于 CLR 函数,可以使用除 textntextimagetimestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。不能将非标量类型 cursortable 指定为 Transact-SQL 函数或 CLR 函数中的返回数据类型。
  • 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
    指定将程序集与函数绑定的方法。assembly_name 必须与 SQL Server 中当前数据库内具有可见性的现有程序集匹配。class_name 必须是有效的 SQL Server 标识符,并且必须作为类存在于程序集中。如果类具有以命名空间限定的名称,该名称使用句点 (.) 来分隔命名空间的各部分,则必须使用方括号 ([]) 或引号 ("") 分隔类名称。method_name 必须是有效的 SQL Server 标识符,并且必须作为静态方法存在于指定类中。

    ms186967.note(zh-cn,SQL.90).gif注意:
    默认情况下,SQL Server 不能执行 CLR 代码。可以创建、修改和删除引用公共语言运行时模块的数据库对象;不过,只有在启用 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_namedata_type } [ ,...n ] ),
    定义 CLR 函数的表数据类型。表声明仅包含列名称和数据类型。

<function_option>::= and <clr_function_option>::=

指定函数将具有以下一个或多个选项:

  • ENCRYPTION
    指示数据库引擎对目录视图中包含 ALTER FUNCTION 语句文本的列进行加密。使用 ENCRYPTION 可以防止将函数作为 SQL Server 复制的一部分发布。不能为 CLR 函数指定 ENCRYPTION。
  • SCHEMABINDING
    指定将函数绑定到其引用的数据库对象。如果其他架构绑定对象也在引用该函数,此条件可防止更改该函数。

    只有发生下列操作之一时,才会删除函数与其引用对象的绑定:

    • 删除函数。
    • 在未指定 SCHEMABINDING 选项的情况下,使用 ALTER 语句修改函数。

    有关函数绑定到架构前必须满足的条件的列表,请参阅 CREATE FUNCTION (Transact-SQL)

    不能为 CLR 函数或引用别名数据类型的函数指定 SCHEMABINDING。

  • RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT
    指定标量值函数的 OnNULLCall 属性。如果未指定,则默认为 CALLED ON NULL INPUT。这意味着即使传递的参数为 NULL,也将执行函数体。

    如果在 CLR 函数中指定了 RETURNS NULL ON NULL INPUT,它指示当 SQL Server 接收到的任何一个参数为 NULL 时,它可以返回 NULL,而无需实际调用函数体。如果 <method_specifier> 中指定的 CLR 函数的方法已具有指示 RETURNS NULL ON NULL INPUT 的自定义属性,但 ALTER FUNCTION 语句指示 CALLED ON NULL INPUT,则优先采用 ALTER FUNCTION 语句指示的属性。不能为 CLR 表值函数指定 OnNULLCall 属性。

  • EXECUTE AS 子句
    指定用于执行用户定义函数的安全上下文。所以,您可以控制 SQL Server 使用哪一用户帐户来验证针对该函数引用的任何数据库对象的权限。

    ms186967.note(zh-cn,SQL.90).gif注意:
    不能为内联用户定义函数指定 EXECUTE AS。

    有关详细信息,请参阅 EXECUTE AS 子句 (Transact-SQL)

< column_definition >::=

定义表数据类型。表声明包含列定义和约束。对于 CLR 函数,只能指定 column_namedata_type

  • column_name
    表中列的名称。列名称必须符合标识符规则,并且在表中必须是唯一的。column_name 可以由 1 至 128 个字符组成。
  • data_type
    指定列数据类型。对于 Transact-SQL 函数,可以使用除 timestamp 之外的所有数据类型(包括 CLR 用户定义类型)。对于 CLR 函数,可以使用除 textntextimagecharvarcharvarchar(max)timestamp 之外的所有数据类型(包括 CLR 用户定义类型)。在 Transact-SQL 或 CLR 函数中,非标量类型 cursor 不能指定为列数据类型。
  • DEFAULT constant_expression
    指定当插入过程中没有显式提供值时为列提供的值。constant_expression 可以是常量、NULL 或系统函数值。DEFAULT 定义可以应用于除具有 IDENTITY 属性的列之外的任何列。不能为 CLR 表值函数指定 DEFAULT。
  • COLLATE collation_name
    指定列的排序规则。如果未指定,则为该列分配数据库的默认排序规则。排序规则名称既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。有关列表和详细信息,请参阅 Windows 排序规则名称 (Transact-SQL)SQL 排序规则名称 (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 >::= and < table_constraint>::=

为指定列或表定义约束。对于 CLR 函数,允许的唯一约束类型为 NULL。不允许命名约束。

  • NULL | NOT 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
    指定一个百分比,指示在创建或更改索引期间,数据库引擎对各索引页的叶级填充的程度。fillfactor 必须为介于 1 至 100 之间的整数值。默认值为 0。
  • IGNORE_DUP_KEY = { ON | OFF }
    指定当对唯一聚集索引或唯一非聚集索引的多行插入事务中出现重复键值时的错误响应。默认值为 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)

其他资源

用户定义函数(数据库引擎)
对发布数据库进行架构更改

帮助和信息

获取 SQL Server 2005 帮助