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_nameFunction 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
    要更改的用户定义函数。

    注意注意

    即使未指定参数,函数名称后也需要加上括号。

  • **@**parameter_name
    用户定义函数中的参数。可声明一个或多个参数。

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

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

    注意注意

    在存储过程或用户定义函数中传递参数时,或在批语句中声明和设置变量时,不会遵守 ANSI_WARNINGS。例如,如果将变量定义为 char(3) 类型,然后将其值设置为多于三个字符,则数据将截断为定义大小,并且 INSERT 或 UPDATE 语句可以成功执行。

  • [ type_schema_name. ] parameter_data_type
    参数的数据类型及其所属的架构(可选)。对于 Transact-SQL 函数,可以使用除 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。对于 CLR 函数,可以使用除 text、ntext、image 和 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。不能将非标量类型 cursor 和 table 指定为 Transact-SQL 函数或 CLR 函数中的参数数据类型。

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

    • 包含 SQL Server 系统数据类型名称的架构。

    • 当前数据库中当前用户的默认架构。

    • 当前数据库中的 dbo 架构。

  • [ **=**default ]
    参数的默认值。如果定义了 default 值,则无需指定此参数的值即可执行函数。

    注意注意

    可以为除 varchar(max) 和 varbinary(max) 数据类型之外的 CLR 函数指定默认参数值。

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

  • return_data_type
    标量用户定义函数的返回值。对于 Transact-SQL 函数,可以使用除 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。对于 CLR 函数,可以使用除 text、ntext、image 和 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。不能将非标量类型 cursor 和 table 指定为 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 标识符,并且必须作为静态方法存在于指定类中。

    注意注意

    默认情况下,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>::= 和 <clr_function_option>::=

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

  • ENCRYPTION
    指示数据库引擎对目录视图中包含 ALTER FUNCTION 语句文本的列进行加密。使用 ENCRYPTION 可以防止将函数作为 SQL Server 复制的一部分发布。不能为 CLR 函数指定 ENCRYPTION。

  • 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,则表示当 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 使用哪一用户帐户来验证针对该函数引用的任何数据库对象的权限。

    注意注意

    不能为内联用户定义函数指定 EXECUTE AS。

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

< column_definition >::=

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

  • column_name
    表中列的名称。列名称必须符合标识符规则,并且在表中必须是唯一的。column_name 可以由 1 至 128 个字符组成。

  • data_type
    指定列数据类型。对于 Transact-SQL 函数,可以使用除 timestamp 之外的所有数据类型(包括 CLR 用户定义类型)。对于 CLR 函数,可以使用除 text、ntext、image、char、varchar、varchar(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 Server 排序规则名称 (Transact-SQL)

    COLLATE 子句只能用来更改数据类型为 char、varchar、nchar 和 nvarchar 的列的排序规则。

    不能为 CLR 表值函数指定 COLLATE。

  • ROWGUIDCOL
    指示新列是行的全局唯一标识符列。对于每个表,只能将其中的一个 uniqueidentifier 列指定为 ROWGUIDCOL 列。ROWGUIDCOL 属性只能分配给 uniqueidentifier 列。

    ROWGUIDCOL 属性并不强制列中所存储值的唯一性。该属性也不会为插入表的新行自动生成值。若要为每列生成唯一值,请在 INSERT 语句中使用 NEWID 函数。可以指定默认值;但是,不能将 NEWID 指定为默认值。

  • IDENTITY
    指示新列是标识列。在为表添加新行时,SQL Server 将为该列提供唯一的增量值。标识列通常与 PRIMARY KEY 约束一起使用,作为表的唯一行标识符。可以将 IDENTITY 属性分配给 tinyint、smallint、int、bigint、decimal(p,0) 或 numeric(p,0) 列。每个表只能创建一个标识列。不能对标识列使用绑定默认值和 DEFAULT 约束。必须同时指定 seed 和 increment,或者二者都不指定。如果二者都未指定,则取默认值 (1,1)。

    不能为 CLR 表值函数指定 IDENTITY。

    • seed
      要分配给表中第一行的整数值。

    • increment
      要加到表中后续行的 seed 值上的整数值。

< column_constraint >::= 和 < 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 }
    指定在插入操作尝试向唯一索引插入重复键值时的错误响应。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 权限。