设为首页 收藏本站
查看: 1007|回复: 0

[经验分享] 【SQL Server学习笔记】SQL Server 用户定义函数、用户定义类型

[复制链接]

尚未签到

发表于 2018-10-16 11:01:23 | 显示全部楼层 |阅读模式
  用户定义函数分为:标量函数,内联表值函数,多语句表值函数。
  1、标量函数
create table dbo.t (id int not null primary key clustered,  mStr varchar(300) )   create table dbo.tt (main_id int not null,  v varchar(100) not null,  foreign key(main_id) references t(id) )  insert into dbo.t(id) values(1),       (2),       (3)        insert into dbo.tt(main_id,v) values(1,'a'),       (1,'b'),       (2,'c'),       (2,'d'),       (2,'efg'),       (3,'higklmn')   --创建标量函数 create function dbo.mergeStr(@id int,@split varchar(10)) returns varchar(300) as begin declare @str varchar(300);  set @str = '';  select @str = @str + v + @split from dbo.tt where main_id = @id  set @str = left(@str , len(@str) - LEN(@split) )  return @str   --返回值 end go   --使用函数 select t.id,        dbo.mergeStr(t.id,',')  from dbo.t    --通过函数更新 update dbo.t set mstr = dbo.mergeStr(t.id,',')   2、内联表值函数
--内嵌表值函数,只包含一个return,不能包含其他语句 --注意:各视图或函数中的列名必须唯一。 create function dbo.display(@id int ) returns table as  return(    with t    as    ( select t.id,    t.mstr,    m.v from dbo.t cross apply dbo.splitstr(t.mstr,',') m where t.id = @id    )                select t.id,   t.mstr,   t.v as splitV,            tt.main_id,   tt.v    from t    inner join dbo.tt    on t.id = tt.main_id   and t.v = tt.v              ) go   --使用内联表值函数 select * from dbo.display(1)   3、多语句表值函数
--创建多语句表值函数 create function dbo.splitStr(@str varchar(300),@split varchar(10)) returns @t table(v varchar(50)) as begin  declare @temp varchar(50);  set @temp = '';  while charindex(@split,@str) > 0 begin set @temp = LEFT(@str,CHARINDEX(@split,@str) - 1 );  insert into @t(v) values(@temp);  set @str = STUFF(@str,1,charindex(@split,@str),'') end  insert into @t(v) values(@str) return;   --返回 end go   --使用表值函数 select t.id,        t.v,        m.x from dbo.t cross apply dbo.splitStr(t.mstr,',')   4、函数的元数据
select o.name,        type,        type_desc from sys.objects o inner join sys.sql_modules s         on s.object_id = o.object_id  where type in ('fn','tf','if')   5、用户定义类型
--1.创建用户定义类型 create type dbo.user_defined_type from varchar(20) not null   create table dbo.txt (vid int not null,  v user_defined_type)  --用户定义类型用在表列中   --用户定义类型用在存储过程的参数中 create procedure dbo.usp_txt(@v user_defined_type) as begin select * from dbo.txt where v = @v end go     --2.定义表值用户定义类型,这样的类型是一个表 create type table_value_user_defined_type as table (vid int ,  v user_defined_type )   --这里的参数@t的类型是一个表 create procedure dbo.usp_tt_txt (@t as table_value_user_defined_type readonly) as begin insert into dbo.txt(vid,v) select vid,        V from @t end go   --注意这里必须定义与上面一样的表值类型 declare @tt as table_value_user_defined_type  insert into @tt  values(1,'a'),       (2,'b'),       (3,'c')        --传入参数是一个表,类型与存储过程中定义是一样的 exec dbo.usp_tt_txt @t = @tt    --3.用户定义类型的元数据 --有哪些列使用了用户定义类型 select t.name as typename,                OBJECT_NAME(c.object_id) as tablename,        c.name as columnname from sys.types t inner join sys.columns c         on c.user_type_id = t.user_type_id where t.name = 'user_defined_type'          --表值类型 select * from sys.objects where type_desc = 'TYPE_TABLE'    --3.删除用户定义类 --要先删除引用用户定义类型的对象  drop procedure dbo.usp_tt_txt drop table dbo.txt drop procedure dbo.usp_txt  drop type dbo.table_value_user_defined_type  drop type dbo.user_defined_type


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-622266-1-1.html 上篇帖子: vCenter Server 所需的端口 下篇帖子: SQL Server数据库mdf文件中了bip勒索病毒。扩展名变为.bip-jogewang123的博客
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表