- SQL中的视图、存储过程与函数
- 视图可以被看成是虚拟表或存储查询
- 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集(SQL语句和可选控制流语句) 经编译后存储在数据库中 用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它
- 函数 存储过程执行的本质是一样的(但函数可以嵌入在sql中使用 可以在select中调用 存储过程则不行)
- 表值函数与标量函数:前者只能返回一个表、后者则可以返回基类型
- 存储过程
create procedure AddStudent --定义存储过程
@Name nvarchar(10),
@Age int,
@Bonus decimal(18,2),
@Gender int
as
begin
insert into Student(Name,Age,Bonus,Gender)values(@Name,@Age,@Bonus,@Gender)
end
exec AddStudent '张菲',21,200,2 --执行存储过程
select * from Student --再次查询表内容
- 函数
- 表值函数
<!--功能说明:分割字符串转成数据表 / 输入参数:@inputstr(原始字符串), @seprator(分割符) / 输出参数:无-->
create function ufn_StrSplit --创建函数
(
@inputstr varchar(max), --创建函数参数
@seprator varchar(100)
)
returns @temp table(s varchar(200))
as
begin
declare @i int
set @inputstr=ltrim(rtrim(@inputstr))
set @i=charindex(@seprator,@inputstr)
while @i>0
begin
insert @temp values(left(@inputstr, @i-1))
set @inputstr=substring(@inputstr, @i+1, len(@inputstr)-@i)
set @i=charindex(@seprator, @inputstr)
end
return
end
- 标量函数
<!--功能说明:返回两日期之间的时间 / 输入参数:@fromdate(日期), @todate(日期), @rand(浮点数) / 输出参数:nvarchar(100)-->
create function RandTime
(
@fromdate datetime,
@todate datetime,
@rand float
)
returns nvarchar(100)
as
begin
declare @return nvarchar(100)
declare @millisecond bigint --直接精确到毫秒
declare @randdate datetime
declare @mindate datetime
--读取工作日时间约束
if @rand<0.4
set @rand=@rand+0.4
else if @rand>0.8
set @rand=@rand-0.1
select @mindate=(case when @fromdate>@todate then @todate else @fromdate end); --取两个时间中的较小时间值
set @millisecond=datediff(ms,@fromdate,@todate);
set @randDate=dateadd(ms,@rand*@millisecond,@mindate);
set @return=convert(varchar(19),@randdate,120);
return @return
end
- 数字函数
abs(): 绝对值
ceiling(): 舍入到最大整数/天花板
floor(): 舍入到最小整数/地板
round(): 四舍五入/”舍入到离我半径最近的数” round(-3.146,2)=-3.15
max(): 最大值
min(): 最小值
avg(): 平均值
sum(): 和
count(): 数量
- 字符串函数
len(): 字符串长度
lower()/upper(): 转小写/大写
lrtim(): 去掉左侧空格
rtrim(): 去掉右侧空格
substring(string,start_position,length): 取子字符串/与C#不同 start_position参数从1开始
- 日期函数
getdate(): 取得当前日期时间
dateadd(datepart,number,date): 计算增加后日期/date为待计算日期/number为增量/datepart为计量单位(年year/yy 季度quarter/qq 月month/mm 当年度第几天dayofyear/dy 天day/dd 小时hour/hh …)
datediff(datepart,startdate,enddate): 计算两日期差额
datepart(datepart,date): 返回一个日期的特定部分
- 类型转换函数
<!--cast(expression as data_type)/convert(data_type as expression)-->
select cast(‘12’,int),cast(‘2008-10-10’,datetime),convert(vchar(50),’12’)
select convert(int,’123’)+1 //转换为计算类型
- 空值处理函数
<!--Isnull(expression,value): expression不为空则返回expression 否则返回value-->
select isnull(name,’佚名’) as 姓名 from t_person1
1. case函数(单值判断/相当于C#switch case)
select
(
case level
when 1 then ‘good’
when 2 then ‘bad’
else ‘hello’
)
from t_person
1. case函数(范围判断)
select name
(
case
when salary<2000 then ‘低收入’
when salary>5000 then ‘高收入’
else ‘不明’
) as ‘收入水平’
from t_person