diff --git "a/45\346\235\216\346\266\233/\344\275\234\344\270\232/\345\207\275\346\225\260\344\275\234\344\270\232.md" "b/45\346\235\216\346\266\233/\344\275\234\344\270\232/\345\207\275\346\225\260\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..77f77cfe7854473cb275c7a67bc8f7575b0c6ee2 --- /dev/null +++ "b/45\346\235\216\346\266\233/\344\275\234\344\270\232/\345\207\275\346\225\260\344\275\234\344\270\232.md" @@ -0,0 +1,63 @@ +```sql +--(1)编写一个函数求该银行的金额总和 +--drop function Tsum +go +create function Tsum() +returns int +as +begin +declare @ss int =(select sum(CardMoney) from BankCard) + return @ss +end +go +select dbo.tsum() 金额总数 +--(2)传入账户编号,返回账户真实姓名 +--drop function tid +go +create function Tid(@id varchar(30)) +returns varchar(20) +as +begin + + return (select RealName from AccountInfo where AccountId=@id) +end +go +select dbo.Tid('2') +--(3)传递开始时间和结束时间,返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 +--select * from CardExchange --交易记录 + +go +create function Tranc(@star smalldatetime ,@end smalldatetime) +returns @table table(ReName varchar(20),CardNo varchar(30),MoneyInBank money,MoneyOutBank money,ExchangeTime time) +as +begin + insert into @table + select RealName,c.CardNo,MoneyInBank,MoneyOutBank,ExchangeTime + from CardExchange c join BankCard b on c.CardNo=b.CardNo join AccountInfo a on b.AccountId=a.AccountId + where ExchangeTime between @star and @end + return +end +go +select * from Tranc('2022-09-20','2022-09-22') +--方案一(逻辑复杂,函数内容除了返回结果的sql语句还有其他内容,例如定义变量等): + +--(4)查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”,根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户",分别显示卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +--方案一:直接在sql语句中使用case when + +--方案二:将等级和状态用函数实现 + +--(5)编写函数,根据出生日期求年龄,年龄求实岁,例如: +go +create function data(@star smalldatetime,@end smalldatetime) +returns varchar(20) +as +begin +return(select year(@end)-year(@star) from table_name) +end +go +select dbo.data('2018-5-4','2000-5-5') +-- 生日为2000-5-5,当前为2018-5-4,年龄为17岁 +-- 生日为2000-5-5,当前为2018-5-6,年龄为18岁 +``` + diff --git "a/45\346\235\216\346\266\233/\347\254\224\350\256\260/220921\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260function.md" "b/45\346\235\216\346\266\233/\347\254\224\350\256\260/220921\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260function.md" new file mode 100644 index 0000000000000000000000000000000000000000..6e06c4653d23dcd31a8862d6719277937df8ec97 --- /dev/null +++ "b/45\346\235\216\346\266\233/\347\254\224\350\256\260/220921\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260function.md" @@ -0,0 +1,61 @@ +### SQL自定义函数function + +用户定义自定义函数像内置函数一样返回**标量值**,也可以将结果集用**表格变量返回**。 +**sql函数必须有返回值。** + +##### 区别 + +标量函数:返回一个标量值。 +表格值函数{内联表格值函数、多表格值函数}:返回行集(即返回多个值) + +#### 1.标量函数 + +```sql +create function function_name (参数) +returns 返回值数据类型 +as +begin + sql语句(必须有return变量或值) +end + + +例子 +create function SumRes(@sco nvarchar(20)) +returns real +as +begin + +declare @sum real --变量 +declare @code varchar(11) --变量 + +set @code = @sco+'%' --赋值 +select @sum = sum(result)from LearnResult where scode like @code --查询结果赋值 + +return @sum +end +引用自定义函数 +select 用户名.函数名 as 字段别名(未在课堂学习到,不知具体效果) +select dbo.AvgResult('s0002')as result +课堂通用效果 +select dbo.function_name (参数) + + +``` + +#### 2.表格值函数 + +```sql +create function function_name(参数) +returns @变量名 table (函数绑定对象,函数一旦绑定,则不能删除、修改,除非删除绑定) +as +return(sql语句) + +例子 +cerate function tabcmess(@code nvarchar(50)) +returns table +as +return(select id name from tableName) +``` + +对表格变量中可以执行 select, insert, update, delete, +但select into 和 insert 语句的结果集是从存储过程插入。 \ No newline at end of file