函数

你一个不经意的笑容,就温暖了我整个世界。--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
posted @ 2024-07-01 23:27  小脑虎爱学习  阅读(13)  评论(0)    收藏  举报