修改表值函数注意事项
更改先前通过执行 CREATE FUNCTION 语句创建的现有 Transact-SQL 或 CLR 函数,但不更改权限,也不影响任何相关的函数、存储过程或触发器。
不能用 ALTER FUNCTION 将表值函数更改为标量值函数,反之亦然。
不能用 ALTER FUNCTION 将内联函数更改为多语句函数,反之亦然。
不能使用 ALTER FUNCTION 将 Transact-SQL 函数更改为 CLR 函数,反之亦然。
需要对函数或架构具有 ALTER 权限。 如果函数指定用户定义类型,则需要对该类型具有 EXECUTE 权限。
使用SSMS数据库管理工具修改表值函数和使用T-SQL脚本修改表值函数语法相同。
下列 Service Broker 语句不能包含在 Transact-SQL 用户定义函数的定义中:
- BEGIN DIALOG CONVERSATION
- END CONVERSATION
- GET CONVERSATION GROUP
- MOVE CONVERSATION
- RECEIVE
- SEND
使用T-SQL脚本修改表值函数
语法:
语法一:修改表值函数。
--声明数据库引用
use 数据库名;
go
--修改表值函数
alter function [schema_name.] function_name
(@parameter_name [as] [type_schema_name.] parameter_data_type [ = default ] [ readonly],..n)
returns table
[with] [encryption][,][schemabinding]
as
return [ ( ] select_stmt [ ) ]
go
语法二:修改内联表值函数。
--声明数据库引用
use 数据库名;
go
--创建表值函数
create functino [schema_name.] function_name
(@parameter_name [as] [type_schema_name.] parameter_data_type [ = default ] [ readonly],..n)
returns @tablename table
(
@parameter_name [as] [type_schema_name.] parameter_data_type [ = default ] ,
...n
)
begin
insert into @tablename(参数1,参数2,...n)
select 参数1,参数2,...n from table
[inner | left | right] [join] [table] [on] [条件]
[where 条件]
[group by 条件]
[having 条件]
[order by 条件]
;
return
end;
go
语法解析:
--schema_name
--用户定义函数所属的架构的名称。
--function_name
--用户定义函数的名称。 函数名称必须符合标识符规则,并且在数据库中以及对其架构来说是唯一的,即使未指定参数,函数名称后也需要加上括号。
--@parameter_name
--用户定义函数中的参数。 可声明一个或多个参数。
--一个函数最多可以有 2,100 个参数。 执行函数时,如果未定义参数的默认值,则用户必须提供每个已声明参数的值。
--通过将 at 符号 (@) 用作第一个字符来指定参数名称。 参数名称必须符合标识符规则。 参数是对应于函数的局部参数;其他函数中可使用相同的参数名称。
--参数只能代替常量,而不能用于代替表名、列名或其他数据库对象的名称。
--[ type_schema_name. ] parameter_data_type
--参数的数据类型及其所属的架构,后者为可选项。 对于 Transact-SQL 函数,允许使用除 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型和用户定义表类型)。
--对于 CLR 函数,允许使用除 text、ntext、image、用户定义表类型和 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。 在 Transact-SQL 函数或 CLR 函数中,
--不能将非标量类型 cursor 和 table 指定为参数数据类型。
--如果未指定 type_schema_name, 数据库引擎会按以下顺序查找 scalar_parameter_data_type:
--包含 SQL Server 系统数据类型名称的架构。
--当前数据库中当前用户的默认架构。
--当前数据库中的 dbo 架构。
--[ =default ]
--参数的默认值。 如果定义了 default 值,则无需指定此参数的值即可执行函数。
--如果函数的参数有默认值,则调用该函数以检索默认值时,必须指定关键字 DEFAULT。 此行为与在存储过程中使用具有默认值的参数不同,在后一种情况下,不提供参数同样意味着使用默认值。
--但在通过使用 EXECUTE 语句调用标量函数时,DEFAULT 关键字不是必需的。
--readonly
--指示不能在函数定义中更新或修改参数。 如果参数类型为用户定义的表类型,则应指定 READONLY。
--return_data_type
--标量用户定义函数的返回值。 对于 Transact-SQL 函数,可以使用除 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。
--对于 CLR 函数,允许使用除 text、ntext、image 和 timestamp 数据类型之外的所有数据类型(包括 CLR 用户定义类型)。 在 Transact-SQL 函数或 CLR 函数中,不能将非标量类型 cursor 和 table 指定为返回数据类型。
--encryption
--适用范围: SQL Server 2008 到 SQL Server 2017。
--指示 数据库引擎会将 CREATE FUNCTION 语句的原始文本转换为模糊格式。 模糊代码的输出在任何目录视图中都不能直接显示。 对系统表或数据库文件没有访问权限的用户不能检索模糊文本。
--但是,可以通过 DAC 端口访问系统表的特权用户或直接访问数据库文件的特权用户可以使用此文本。 此外,能够向服务器进程附加调试器的用户可在运行时从内存中检索原始过程。
--使用此选项可防止将函数作为 SQL Server 复制的一部分发布。 不能为 CLR 函数指定此选项。
--schemabinding
--指定将函数绑定到其引用的数据库对象。 如果指定了 SCHEMABINDING,则不能按照将影响函数定义的方式修改基对象。 必须首先修改或删除函数定义本身,才能删除将要修改的对象的依赖关系。
--@tablename
--自定义表名
调用语法:
select 字段名,...n from 架构名.函数名(参数值);
示例:
--声明数据库引用
use testss;
go
--修改内联表值函数
alter function dbo.innertablefun(@ids int=null)
returns @table1 table
(
id int not null,
name nvarchar(100),
sex nvarchar(100),
test3id int,
test3name nvarchar(100)
)
with encryption,schemabinding
as
begin
with tmptable as (
select a.id,a.name,a.sex,b.id as test3id,b.name as test3name
from dbo.test1 as a
inner join dbo.test3 as b on a.classid=b.id
where a.id=@ids
)
insert into @table1(id,name,sex,test3id,test3name)
select id,name,sex,test3id,test3name from tmptable
return;
end;
go