SQLServer之修改表值函数

修改表值函数注意事项

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

不能用 ALTER FUNCTION 将表值函数更改成标量值函数,反之亦然。服务器

不能用 ALTER FUNCTION 将内联函数更改成多语句函数,反之亦然。架构

不能使用 ALTER FUNCTION 将 Transact-SQL 函数更改成 CLR 函数,反之亦然。函数

须要对函数或架构具备 ALTER 权限。 若是函数指定用户定义类型,则须要对该类型具备 EXECUTE 权限。工具

使用SSMS数据库管理工具修改表值函数和使用T-SQL脚本修改表值函数语法相同。spa

下列 Service Broker 语句不能包含在 Transact-SQL 用户定义函数的定义中:
BEGIN DIALOG CONVERSATION
END CONVERSATION
GET CONVERSATION GROUP
MOVE CONVERSATION
RECEIVE
SENDscala

使用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

示例结果:依次显示建立结果和调用结果。

clipboard.png

clipboard.png

相关文章
相关标签/搜索