1 --==============================用户定义数据类型和函数===============================
2 --用户定义数据类型
3 EXEC sp_addtype 说明,'nvarchar(500)','null'
4
5 --删除用户定义数据类型
6 DROP TYPE 说明
7 --OR:
8 EXEC sp_droptype 说明
9
10 --标量值函数
11 --目标:返回某年份的订单总金额
12 CREATE FUNCTION 订单总额(@year int)
13 RETURNS money --RETURNS + 返回值类型
14 BEGIN
15 DECLARE @total money
16 SELECT @total = SUM(b.单价*b.数量*(1-b.折扣))
17 FROM 订单 a
18 JOIN 订单明细 b
19 ON a.订单ID = b.订单ID
20 WHERE YEAR(订购日期) = @year
21 GROUP BY YEAR(订购日期)
22
23 RETURN @total;
24 END
25 GO
26 --注意Schema不能丢
27 PRINT '1998年的订单总额为:'+CONVERT(nvarchar(10),dbo.订单总额(1998))
28
29 --内联表值函数
30 --目标:显示某时间段内的订单
31 CREATE FUNCTION 时间段订单(@beginDate datetime,@endDate datetime)
32 RETURNS TABLE
33 RETURN SELECT * FROM 订单 WHERE 订购日期 BETWEEN @beginDate AND @endDate
34 GO
35 SELECT * FROM 时间段订单('1996-7-1','1999-05-30')
36
37 --多语句表值函数
38 --目标:显示全部的人员,包括供应商、客户、运货商、雇员
39 CREATE FUNCTION 全部人员() --就算没有参数,括号也不能少
40 RETURNS @名单 TABLE
41 (
42 编号 int IDENTITY(1,1) NOT NULL Primary key,
43 姓名 nvarchar(30) NOT NULL,
44 地址 nvarchar(500) NULL,
45 邮编 varchar(20) NULL,
46 电话 varchar(20) NULL,
47 类别 nvarchar(10) NOT NULL
48 )
49 BEGIN
50 INSERT INTO @名单
51 SELECT 联系人姓名,地址,邮政编码,电话,'供应商' FROM 供应商
52
53 INSERT INTO @名单
54 SELECT 联系人姓名,地址,邮政编码,电话,'客户' FROM 客户
55
56 INSERT INTO @名单
57 SELECT 公司名称,NULL,NULL,电话,'运货商' FROM 运货商
58
59 INSERT INTO @名单
60 SELECT 姓氏+名字,地址,邮政编码,家庭电话+'-'+分机,'雇员' FROM 雇员
61
62 RETURN
63 END
64 GO
65 SELECT * FROM 全部人员()
66
67
68 select 雇员ID from 订单
69 WHERE YEAR(订购日期) = 1998
70 group by 雇员ID
71 ORDER BY COUNT(订单ID) DESC
72
73 select * from 订单
74 WHERE YEAR(订购日期) = 1998
75 and 雇员ID = 5
76
77 --用户定义函数也可以用来设置默认值、约束、计算列等
78 --目标:新建一个表,将编号字段的默认值设为TCP-1,TCP-2,TCP-3...
79 --创建函数
80 CREATE FUNCTION 自增长编号()
81 RETURNS varchar(10)
82 BEGIN
83 DECLARE @编号 varchar(10)
84 DECLARE @id int
85 SELECT TOP 1 @编号 = 编号 FROM 自增长编号测试表 ORDER BY 编号 DESC
86 IF(@@ROWCOUNT = 0)
87 SET @编号 = 'TCP-1'
88 ELSE
89 BEGIN
90 --获取编号的数字部分并+1
91 SET @id = SUBSTRING(@编号,5,LEN(@编号)-4) + 1
92 SET @编号 = 'TCP-' + CONVERT(varchar(10),@id)
93 END
94 RETURN @编号
95 END
96 GO
97 --创建表
98 CREATE TABLE 自增长编号测试表
99 (
100 编号 varchar(10) DEFAULT dbo.自增长编号() NOT NULL,
101 名称 varchar(10) NULL
102 )
103 GO
104 --插入数据
105 INSERT INTO 自增长编号测试表(名称) VALUES('aaa')
106 INSERT INTO 自增长编号测试表(名称) VALUES('bbb')
107 INSERT INTO 自增长编号测试表(名称) VALUES('ccc')
108 SELECT * FROM 自增长编号测试表
109
110 --删除用户定义函数
111 DROP FUNCTION 订单总额