函数
你一个不经意的笑容,就温暖了我整个世界。--chen
函数
定义:
函数分为(1)系统函数,(2)自定义函数。
其中自定义函数又可分为(1)标量值函数(返回单个值),(2)表值函数(返回查询结果)
示例:
(1)编写一个函数求该银行的金额总和
create function GetSumCardMoney()
returns money
as
begin
declare @AllMoney money
select @AllMoney =(select SUM(CardMoney) from BankCard)
return @AllMoney
end
函数调用
select dbo.GetSumCardMoney()
上述函数没有参数,下面介绍有参数的函数的定义及使用
(2)传入账户编号,返回账户真实姓名
create function GetRealNameById(@AccountId int) return varchar(20)
as
begin
declare @name varchar(30)
select @name =(select RealName from AccountInfo where AccountId = @accid)
return @name
end
select dbo.GetRealNameById(2)
(3)传递开始时间和结束时间,返回交易记录(存钱取钱)
--交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。(表值函数)
方案一(可以处理更复杂逻辑,函数题除了sql查询外还可以有其他逻辑代码):
create function GetRecordByTime(@start varchar(30),@end varchar(30)) returns @result table
(
RealName varchar(20),--真实姓名
CardNo varchar(30),--银行卡号(与银行卡表形成主外键关系)
MoneyInBank money,--存钱金额
MoneyOutBank money,--取钱金额
ExchangeTime smalldatetime--交易时间
)
as
begin
--declare @i int --可以成功
insert into @result
select RealName 姓名,CardExchange.CardNo 卡号, MoneyInBank 存钱金额, MoneyOutBank 取钱金额, ExchangeTime 交易时间
from CardExchange
inner join BankCard on CardExchange.CardNo = BankCard.CardNo
inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId
where ExchhangeTiem between @start+'00:00:00' and @end+'23:59:59'
return
end
select * from GetRecordByTime('2024-6-1','2024-7-1')
方案二(函数体内只能有return+sql查询结果):
create function GetRecordByTime(@start varchar(30),@end varchar(30)) returns table
as
return
select RealName 姓名,CardExchange.CardNo 卡号, MoneyInBank 存钱金额, MoneyOutBank 取钱金额, ExchangeTime 交易时间
from CardExchange
inner join BankCard on CardExchange.CardNo = BankCard.CardNo
inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId
where ExchhangeTiem between @start+'00:00:00' and @end+'23:59:59'
go
select * from GetRecordByTime('2024-6-1','2024-7-1')
(4)查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”
--根据银行卡余额显示银行卡等级30万以下为“普通用户”,30万以上为“VIP用户”
--分别显示卡号,身份证,姓名,余额,用户等级,银行卡状态
--原方法
select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额,
case
when CardMoney <300000 then '普通用户'
else 'VIP用户'
end 用户等级
case CardState
when 1 then '正常'
when 1 then '挂失'
when 1 then '冻结'
when 1 then '注销'
else '异常'
from BankCard inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId
--用户等级函数
create function GetGrade(@cardmoney money) return varchar(30)
as
begin
declare @result varchar(30)
if @cardmoney >= 300000
set @result ='VIP用户'
else
set @result ='普通用户'
return @result
end
--求银行卡状态函数
create function GetState(@state int) return varchar(30)
as
begin
declare @result varchar(30)
if @state = 1
set @result ='正常'
else if @state = 2
set @result ='挂失'
else if @state = 3
set @result ='冻结'
else if @state = 4
set @result ='注销'
else
set @result ='异常'
return @result
end
--调用函数
select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额,
dbo.GetGrade(CardMoney) 用户等级, dbo.GetState(CardState) 银行卡状态
from BankCard inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId
(5)编写函数,根据出生日期求年龄,年龄求实岁,例如:
--生日为2000-5-5,当前为2018-5-4,年龄为17岁
--生日为2000-5-5,当前为2018-5-6,年龄为18岁
create function GetAge(@birth smalldatetime) return int
as
begin
declare @age int
set @age = year(GETDATE())-year(@birth)
if month(getdate()) <month(@birth)
set @age=@age-1
if month(getdate()) =month(@birth) and day(getdate()) = day(@birth)
set @age=@age-1
return @age
end
--调用函数
select *,dbo.GetAge(empBirth) 年龄 from Emp

浙公网安备 33010602011771号