diff --git "a/44 \350\264\272\346\231\213\345\215\223/\344\275\234\344\270\232/9.21\345\207\275\346\225\260.md" "b/44 \350\264\272\346\231\213\345\215\223/\344\275\234\344\270\232/9.21\345\207\275\346\225\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..986ab08f9f15b5483b644a55f88345682dd137e9 --- /dev/null +++ "b/44 \350\264\272\346\231\213\345\215\223/\344\275\234\344\270\232/9.21\345\207\275\346\225\260.md" @@ -0,0 +1,97 @@ +go +create function banksum() +returns int + begin + declare a cursor scroll for (select CardMoney from BankCard) + open a + declare @a int =0 + declare @b int + fetch first from a into @b + while @@FETCH_STATUS=0 + begin + set @a+=@b + fetch next from a into @b + end + close a + return @a + end +go +select dbo.banksum() +--(2)传入账户编号,返回账户真实姓名 +go +create function bankname(@cardno varchar(40)) +returns varchar(20) + begin + declare @name varchar(20) + select @name=RealName from AccountInfo where AccountId =(select AccountId from BankCard where CardNo = @cardno) + return @name + end +go +select dbo.bankname('6225125478544587') +--(3)传递开始时间和结束时间,返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 + +--方案一(逻辑复杂,函数内容除了返回结果的sql语句还有其他内容,例如定义变量等): +go +create function CardEx(@k date,@j date) +returns @cd table (RealName varchar(40),CardNo varchar(100),MoneyInBank money,MoneyOutBank money,ExchangeTime date) + begin + insert into @cd + select RealName,CardExchange.CardNo,MoneyInBank,MoneyOutBank,ExchangeTime from CardExchange + join BankCard on BankCard.CardNo = CardExchange.CardNo + join AccountInfo on AccountInfo.AccountId = BankCard.AccountId + where ExchangeTime > @k and ExchangeTime < @j + return + end +go +select * from CardEx('2022-09-06',getdate()) +drop function CardEx +--(4)查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”, +--根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户", +--分别显示卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +--方案一:直接在sql语句中使用case when + +--方案二:将等级和状态用函数实现 +go +create function lv(@cardno varchar(40)) +returns @cd1 table (cardno varchar(40),acccode varchar(40),name varchar(40),cardmoney money,lv varchar(40),cardstate varchar(40)) + begin + insert into @cd1 + select CardNo,AccountCode,RealName,CardMoney,(select + case + when CardMoney<300000 then '普通用户' + when CardMoney>=300000 then 'VIP用户' + end '用户等级' + from BankCard where CardNo = @cardno) 用户等级,(select + (case CardState + when 1 then '正常' + when 2 then '挂失' + when 3 then '冻结' + when 4 then '注销' + end) as 银行卡状态 + from BankCard where CardNo = @cardno) 银行卡状态 from AccountInfo + join BankCard on BankCard.AccountId = AccountInfo.AccountId + where AccountInfo.AccountId =(select AccountId from BankCard where CardNo = @cardno) + return + end +go +select * from dbo.lv('6225125478544587') +drop function age +--(5)编写函数,根据出生日期求年龄,年龄求实岁,例如: + +--​ 生日为2000-5-5,当前为2018-5-4,年龄为17岁 +--​ 生日为2000-5-5,当前为2018-5-6,年龄为18岁 +go +create function age(@empb date) +returns varchar(100) + begin + declare @age int + declare @age1 date + declare @age2 varchar(100) + set @age1 = getdate() + set @age = year(@age1)-year(@empb) + set @age2 = '生日为'+convert(varchar(20),@empb)+',当前为'+convert(varchar(20),@age1)+',年龄为'+convert(varchar(20),@age)+'岁' + return @age2 + end +go +select dbo.age('2008-05-08') \ No newline at end of file diff --git "a/44 \350\264\272\346\231\213\345\215\223/\347\254\224\350\256\260/9.21\346\240\207\351\207\217\345\207\275\346\225\260.md" "b/44 \350\264\272\346\231\213\345\215\223/\347\254\224\350\256\260/9.21\346\240\207\351\207\217\345\207\275\346\225\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..5c1aa6f5866a418858f11a71e2a7a0c046013c79 --- /dev/null +++ "b/44 \350\264\272\346\231\213\345\215\223/\347\254\224\350\256\260/9.21\346\240\207\351\207\217\345\207\275\346\225\260.md" @@ -0,0 +1,29 @@ +#### 标量函数 + +接受一个或多个参数并返回单个值,标量函数可帮助简化代码。 例如,可能有许多查询中出现的复杂计算。可以创建一个标量函数来封装公式并在查询中使用它,而不是在每个查询中包含公式 + +#### 创建标量函数 + +create function function_name(parmeter_list) + +return as + +begin + +​ return value + +end + +首先,在`create function`关键字后指定函数的名称。架构名称是可选的。 如果没有明确指定它,SQL Server默认使用`dbo`。 + +其次,在函数名后面指定括号括起来的参数列表。 + +第三,在reurn语句中指定返回值的数据类型。 + +第四,在函数主体内,必须包含一个return语句来返回一个值。 + +#### 删除标量函数 + +drop function function_name; + +例如:drop function dbo.studentinfo \ No newline at end of file diff --git "a/44 \350\264\272\346\231\213\345\215\223/\347\254\224\350\256\260/9.22\346\255\273\351\224\201.md" "b/44 \350\264\272\346\231\213\345\215\223/\347\254\224\350\256\260/9.22\346\255\273\351\224\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..3b32a9af394d5dd6b66b512c5e022973b6ce4b14 --- /dev/null +++ "b/44 \350\264\272\346\231\213\345\215\223/\347\254\224\350\256\260/9.22\346\255\273\351\224\201.md" @@ -0,0 +1,26 @@ +sql server死锁表现一: + +一个用户A 访问表A(锁住了表A),然后又访问表B。另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了,同样用户B要等用户A释放表A才能继续,这就造成死锁了 + +sql server死锁解决方法: + +这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法 + + 仔细分析你程序的逻辑, + +1:尽量避免同时锁定两个资源 + +2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源. + +ql server死锁表现二: + +用户A读一条纪录,然后修改该条纪录。这时用户B修改该条纪录,这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。 + +查询哪些死锁: + +SELECT request_session_id spid, OBJECT_NAME( resource_associated_entity_id ) tableName FROM sys.dm_tran_locks WHERE resource_type = 'OBJECT' + + + + +