diff --git "a/40\345\274\240\350\200\200\344\273\201/\344\275\234\344\270\232/0930\344\275\234\344\270\232.sql" "b/40\345\274\240\350\200\200\344\273\201/\344\275\234\344\270\232/0930\344\275\234\344\270\232.sql" new file mode 100644 index 0000000000000000000000000000000000000000..ce1b3b9d9c805fc689099342e35058b86ba4cd7d --- /dev/null +++ "b/40\345\274\240\350\200\200\344\273\201/\344\275\234\344\270\232/0930\344\275\234\344\270\232.sql" @@ -0,0 +1,121 @@ +--例3:使用游标实现加薪操作 +use test_trigger +select * from People + + + --- 1.声明游标 + -- 1.1滚动游标 (scroll) +declare cur_UpdateSalaryById cursor scroll +for select PeopleId from People + + -- 2.打开游标 +open cur_UpdateSalaryById + -- 3 使用游标 + --声明变量来接受游标放回的值 与 存放加薪值 +declare @id int +declare @money money = 1000 + -- 注意事项: 使用变量存储游标值的格式 fetch ... from 游标名 into 变量名 +fetch first from cur_UpdateSalaryById into @id + --@@fetch_status = 0 : 还有下一行 -1: 提取失败 -2:提取空白行 + -- 每人都加薪1000 +while(@@fetch_status = 0) + begin + update People set PeopleSalary += @money where PeopleId = @id + print cast(@id as varchar(12)) + char(9) + cast(@money as varchar(20)) + fetch next from cur_UpdateSalaryById into @id + end + + -- 4.关闭游标 +close cur_UpdateSalaryById + + -- 5.释放变量 +deallocate cur_UpdateSalaryById + + + + + + +--例4:使用游标删除不达标员工 market(销售字段) +go + select * from People + alter table People add market varchar(20) +update People set market = '1000' where PeopleId = 1 +update People set market = '1500' where PeopleId = 2 +update People set market = '2000' where PeopleId = 6 + + +declare cur_DropMarketById cursor scroll +for select PeopleId from People + +open cur_DropMarketById + +declare @id int +declare @Mk varchar(20) = '' +fetch first from cur_DropMarketById into @id + +while(@@FETCH_STATUS = 0) + begin + set @Mk = (select market from People where PeopleId = @id) + if(@Mk <= 1000) + delete from People where PeopleId = @id + else + fetch next from cur_DropMarketById into @id + end +close cur_DropMarketById +deallocate cur_DropMarketById + +-- 第三题 +-- **************************************************************************************** +go +create table A( + id int primary key, + Province varchar(20), + City varchar(20) +) + +create table B( + id int primary key, + Province varchar(20), + City varchar(20) +) + +insert into A values(1,'福建','厦门') +insert into A values(2,'广东','广州') +insert into A values(3,'福建','龙岩') +insert into A values(4,'云南','昆明') + +insert into B values(1,'江西','南昌') +insert into B values(3,'江苏','南京') +insert into B values(5,'湖北','武汉') +insert into B values(7,'湖南','长沙') + +--要求:使用游标 实现:如果A表与B表中ID字段值相同,那么将B表中的省份,城市 修改成与A表中的城市一致(连表) +select * from A +select * from B + + +declare cur_tempid cursor scroll +for select A.* from A join B on B.id = A.id + +open cur_tempid + + +declare @id int +declare @Province varchar(20) +declare @City varchar(20) + +fetch first from cur_tempid into @id,@Province,@City + + +while(@@FETCH_STATUS = 0) + begin + update B set Province = @Province where id = @id + update B set City = @City where id = @id + fetch next from cur_tempid into @id,@Province,@City + end + + +close cur_tempid + +deallocate cur_tempid \ No newline at end of file diff --git "a/40\345\274\240\350\200\200\344\273\201/\344\275\234\344\270\232/1006\344\275\234\344\270\232.sql" "b/40\345\274\240\350\200\200\344\273\201/\344\275\234\344\270\232/1006\344\275\234\344\270\232.sql" new file mode 100644 index 0000000000000000000000000000000000000000..6761decc92c5d839069ae622fd3a9d4c7d54a8c2 --- /dev/null +++ "b/40\345\274\240\350\200\200\344\273\201/\344\275\234\344\270\232/1006\344\275\234\344\270\232.sql" @@ -0,0 +1,164 @@ +锘--锛1锛夌紪鍐欎竴涓嚱鏁版眰璇ラ摱琛岀殑閲戦鎬诲拰 +use BankTest +go +create function func_GetBankMoneyByAccId() +returns money +as +begin + declare @SumBankMoney money + select @SumBankMoney =(select sum(CardMoney ) from BankCard) + return @SumBankMoney +end +go + + +select dbo.func_GetBankMoneyByAccId() as 閾惰閲戦鎬诲拰 + + +--锛2锛変紶鍏ヨ处鎴风紪鍙凤紝杩斿洖璐︽埛鐪熷疄濮撳悕 +go +create function func_GetInfoByAcco_Id(@id int) +returns varchar(40) +as +begin + declare @name varchar(40) + select @name = (select RealName from AccountInfo where AccountId = @id) + return @name +end +go + +select dbo.func_GetInfoByAcco_Id( 2 ) as 濮撳悕 + + +--锛3锛変紶閫掑紑濮嬫椂闂村拰缁撴潫鏃堕棿锛岃繑鍥炰氦鏄撹褰曪紙瀛橀挶鍙栭挶锛夛紝浜ゆ槗璁板綍涓寘鍚 鐪熷疄濮撳悕锛屽崱鍙凤紝瀛橀挶閲戦锛屽彇閽遍噾棰濓紝浜ゆ槗鏃堕棿銆 + +--鏂规涓锛堥昏緫澶嶆潅锛屽嚱鏁板唴瀹归櫎浜嗚繑鍥炵粨鏋滅殑sql璇彞杩樻湁鍏朵粬鍐呭锛屼緥濡傚畾涔夊彉閲忕瓑锛夛細 + +go +create function func_GetCardExchangeByOpenTimeAndEndTime(@OpenTime smalldatetime,@EndTime smalldatetime) +returns @ExchangTable table( + Name varchar(30), + CardNo varchar(50), + MoneyInBank money, + MoneyOutBank money, + ExchangeTime smalldatetime +) +as +begin + insert into @ExchangTable + select A.RealName,CE.CardNo,CE.MoneyInBank,CE.MoneyOutBank,CE.ExchangeTime from CardExchange CE + join BankCard B on B.CardNo = CE.CardNo + join AccountInfo A on A.AccountId = B.AccountId + where A.OpenTime = @OpenTime and CE.ExchangeTime = @EndTime + return +end +go + +select * from func_GetCardExchangeByOpenTimeAndEndTime('2022-09-19 22:37:00','2022-09-19 22:37:00') + + + + +--锛4锛夋煡璇㈤摱琛屽崱淇℃伅锛屽皢閾惰鍗$姸鎬1,2,3,4鍒嗗埆杞崲涓烘眽瀛椻滄甯,鎸傚け,鍐荤粨,娉ㄩ攢鈥濓紝鏍规嵁閾惰鍗′綑棰濇樉绀洪摱琛屽崱绛夌骇 30涓囦互涓嬩负 +--鈥滄櫘閫氱敤鎴封,30涓囧強浠ヤ笂涓"VIP鐢ㄦ埛"锛屽垎鍒樉绀哄崱鍙凤紝韬唤璇侊紝濮撳悕锛屼綑棰濓紝鐢ㄦ埛绛夌骇锛岄摱琛屽崱鐘舵併 + +--鏂规涓锛氱洿鎺ュ湪sql璇彞涓娇鐢╟ase when +select B.CardNo,AccountCode,RealName,CardMoney, +( + case when CardMoney<300000 then '鏅氱敤鎴' + else 'VIP鐢ㄦ埛' + end +)鐢ㄦ埛绛夌骇, +( + case when CardState=1 then '姝e父' + when CardState=2 then '鎸傚け' + when CardState=3 then '鍐荤粨' else '娉ㄩ攢' + end +)閾惰鍗$姸鎬 +from BankCard B +join AccountInfo A on A.AccountId = B.AccountId + + +--鏂规浜岋細灏嗙瓑绾у拰鐘舵佺敤鍑芥暟瀹炵幇 +--鏌ヨ閾惰鍗′俊鎭紝灏嗛摱琛屽崱鐘舵1,2,3,4鍒嗗埆杞崲涓烘眽瀛椻滄甯,鎸傚け,鍐荤粨,娉ㄩ攢鈥濓紝鏍规嵁閾惰鍗′綑棰濇樉绀洪摱琛屽崱绛夌骇 30涓囦互涓嬩负 +--鈥滄櫘閫氱敤鎴封,30涓囧強浠ヤ笂涓"VIP鐢ㄦ埛"锛屽垎鍒樉绀哄崱鍙凤紝韬唤璇侊紝濮撳悕锛屼綑棰濓紝鐢ㄦ埛绛夌骇锛岄摱琛屽崱鐘舵併 +go +create function fun_GetBankInfoByCardNo(@CardNo varchar(30)) +returns @BankInfo table( + CardNo varchar(30), + AccountCode varchar(30), + Name varchar(30), + CardMoney money, + UserLevel varchar(30), + BankCardStatus varchar(30) +) +as +begin + insert into @BankInfo + select B.CardNo,AccountCode,RealName,CardMoney, + ( + case when CardMoney<300000 then '鏅氱敤鎴' + else 'VIP鐢ㄦ埛' + end + )UserLevel, + ( + case when CardState=1 then '姝e父' + when CardState=2 then '鎸傚け' + when CardState=3 then '鍐荤粨' else '娉ㄩ攢' + end + )BankCardStatus + from BankCard B + join AccountInfo A on A.AccountId = B.AccountId + where CardNo = @CardNo + return +end +go + +select * from fun_GetBankInfoByCardNo('6225547854125656') + + +select * from AccountInfo +select * from CardExchange +select * from BankCard + + +--锛5锛夎〃鏍笺傘傘傘傘傘傘傘傘傘傘 +create table Emp +( + EmpId int primary key identity(1,2), --鑷姩缂栧彿 + empName varchar(20), --濮撳悕 + empSex varchar(4), --鎬у埆 + empBirth smalldatetime --鐢熸棩 +) +insert into Emp(empName,empSex,empBirth) values('鍒樺','鐢','2008-5-8') +insert into Emp(empName,empSex,empBirth) values('鍏崇窘','鐢','1998-10-10') +insert into Emp(empName,empSex,empBirth) values('寮犻','鐢','1999-7-5') +insert into Emp(empName,empSex,empBirth) values('璧典簯','鐢','2003-12-12') +insert into Emp(empName,empSex,empBirth) values('椹秴','鐢','2003-1-5') +insert into Emp(empName,empSex,empBirth) values('榛勫繝','鐢','1988-8-4') +insert into Emp(empName,empSex,empBirth) values('榄忓欢','鐢','1998-5-2') +insert into Emp(empName,empSex,empBirth) values('绠闆','鐢','1992-2-20') +insert into Emp(empName,empSex,empBirth) values('璇歌憶浜','鐢','1993-3-1') +insert into Emp(empName,empSex,empBirth) values('寰愬憾','鐢','1994-8-5') + +--缂栧啓鍑芥暟锛屾牴鎹嚭鐢熸棩鏈熸眰骞撮緞锛屽勾榫勬眰瀹炲瞾锛屼緥濡傦細 + +--鈥 鐢熸棩涓2000-5-5锛屽綋鍓嶄负2018-5-4锛屽勾榫勪负17宀 +--鈥 鐢熸棩涓2000-5-5锛屽綋鍓嶄负2018-5-6锛屽勾榫勪负18宀 + +select * from Emp +go +create function fun_GetAgeByBirth(@id int,@NowTime datetime) +returns int +as +begin + declare @BirthTime datetime + declare @age int + select @BirthTime = (select empBirth from Emp where EmpId = @id) + select @age = DATEDIFF(YY,@BirthTime,@NowTime) + select @age = case when DATEDIFF(DD,DATEADD(YY,@age,@BirthTime),@NowTime)<0 then @age-1 else @age end + return @age +end +go + +select dbo.fun_GetAgeByBirth(9,GETDATE()) as 骞撮緞 diff --git "a/40\345\274\240\350\200\200\344\273\201/\344\275\234\344\270\232/1007\344\275\234\344\270\232.sql" "b/40\345\274\240\350\200\200\344\273\201/\344\275\234\344\270\232/1007\344\275\234\344\270\232.sql" new file mode 100644 index 0000000000000000000000000000000000000000..5a5e6570560f53946531354f51e5cb8d349858c2 --- /dev/null +++ "b/40\345\274\240\350\200\200\344\273\201/\344\275\234\344\270\232/1007\344\275\234\344\270\232.sql" @@ -0,0 +1,88 @@ +--1. 定义存储过程实现查询出账户余额最低的银行卡账户信息,显示银行卡号,姓名,账户余额 +create proc proc_MinMoneyCard +as +begin +-- +select top 1 CardNo 银行卡号,RealName 姓名,CardMoney 余额 +from BankCard inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId +order by CardMoney asc +end +go +--2. 模拟银行卡存钱操作,传入银行卡号,存钱金额,实现存钱操作 +create proc proc_CunQian +@CardNo varchar(30), +@MoneyInBank money +as +update BankCard set CardMoney = CardMoney + @MoneyInBank where CardNo = @CardNo +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values(@CardNo,@MoneyInBank,0,GETDATE()) +go +-- +exec proc_CunQian '6225125478544587',3000 + +--3. 模拟银行卡取钱操作,传入银行卡号,取钱金额,实现取钱操作,取钱成功,返回1,取钱失败返回-1 +Create proc proc_Quqian + @CardNo carchar(30) + @money money +As + -- 进行修改余额的操作 + Update BankCard set CardMoney = CardMoney - @money + Where CardNo = @CardNo + -- 如果有错误,则返回-1 + -- 在存储过程中,return 后面的所有代码都不会执行 + If @@ERROR <>0 + Return -1 + Insert into CardExchange(CardNo, MoneyInBank, MoneyOutBank, ExchangeTime) + Values(@CardNo, 0, @money, getdate()) + Return 1 +Go +--4. **查询出某时间段的银行存取款信息以及存款总金额**,取款总金额, +--传入开始时间,结束时间,显示存取款交易信息的同时,返回存款总金额,取款总金额。 +create proc GetMoneyByTime +@startTime smalldatetime, +@endTime smalldatetime, +@TotalSaveMoney money output, +@TotalWithdrawMoney money output +as +begin + select @TotalSaveMoney = sum(MoneyInBank),@TotalWithdrawMoney=sum(MoneyOutBank) from cardExchange + where ExchangeTime between @startTime and @endTime +end + +-- +declare @startTime smalldatetime = '2022-09-07',@endTime smalldatetime = '2022-09-18' +declare @TotalSaveMoney money,@TotalWithdrawMoney money +exec GetMoneyByTime @startTime,@endTime,@TotalSaveMoney output , @TotalWithdrawMoney output +select @TotalSaveMoney 存款总额,@TotalWithdrawMoney 取款总额 +--5. **密码升级**,传入用户名和密码,如果用户名密码正确,并且密码长度<8,自动升级成8位密码 +--(提示:随机生成 0-9 的整数: float(rand()*10)) rand():随机生成0.0-1.0的小数 float:向下取整) +select FLOOR(RAND()*10) --0-9之间随机数 +create proc procPwdUpgrade +@cardno nvarchar(20), +@pwd nvarchar(20) output +as + if not exists(select * from BankCard where CardNo=@cardno and CardPwd=@pwd) + set @pwd = '' + else + begin + if len(@pwd) < 8 + begin + declare @len int = 8- len(@pwd) + declare @i int = 1 + while @i <= @len + begin + + set @pwd = @pwd + cast(FLOOR(RAND()*10) as varchar(1)) + set @i = @i+1 + end + update BankCard set CardPwd = @pwd where CardNo=@cardno + end + end +go + + + +--调用,声明变量赋初始值,当作输入输出参数 +declare @pwd nvarchar(20) = '123456' +exec procPwdUpgrade '6225547854125656',@pwd output +select @pwd \ No newline at end of file diff --git "a/40\345\274\240\350\200\200\344\273\201/\347\254\224\350\256\260/0930\347\254\224\350\256\260\302\267.txt" "b/40\345\274\240\350\200\200\344\273\201/\347\254\224\350\256\260/0930\347\254\224\350\256\260\302\267.txt" new file mode 100644 index 0000000000000000000000000000000000000000..5f64006b2ef6f4df084d074382a3af194cf36dc7 --- /dev/null +++ "b/40\345\274\240\350\200\200\344\273\201/\347\254\224\350\256\260/0930\347\254\224\350\256\260\302\267.txt" @@ -0,0 +1,64 @@ +娓告爣 +浠涔堟槸娓告爣 +娓告爣(Cursor)瀹冧娇鐢ㄦ埛鍙愯璁块棶鐢盨QL Server杩斿洖鐨勭粨鏋滈泦銆備娇鐢ㄦ父鏍(cursor)鐨勪竴涓富瑕佺殑鍘熷洜灏辨槸鎶婇泦鍚堟搷浣滆浆鎹㈡垚鍗曚釜璁板綍澶勭悊鏂瑰紡銆傜敤SQL璇█浠庢暟鎹簱涓绱㈡暟鎹悗锛岀粨鏋滄斁鍦ㄥ唴瀛樼殑涓鍧楀尯鍩熶腑锛屼笖缁撴灉寰寰鏄竴涓惈鏈夊涓褰曠殑闆嗗悎銆傛父鏍囨満鍒跺厑璁哥敤鎴峰湪SQL server鍐呴愯鍦拌闂繖浜涜褰曪紝鎸夌収鐢ㄦ埛鑷繁鐨勬剰鎰挎潵鏄剧ず鍜屽鐞嗚繖浜涜褰曘 + +娓告爣鍒嗙被: + +锛1锛夐潤鎬佹父鏍(Static)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝鏁版嵁鍙戠敓鍙樺寲锛屾父鏍囦腑鏁版嵁涓嶅彉 锛2锛夊姩鎬佹父鏍(Dynamic)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝鏁版嵁鍙戠敓鍙樺寲锛屾父鏍囦腑鏁版嵁鏀瑰彉锛岄粯璁ゅ笺 锛3锛夐敭闆嗛┍鍔ㄦ父鏍(KeySet)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝琚爣璇嗙殑鍒楀彂鐢熸敼鍙橈紝娓告爣涓暟鎹敼鍙橈紝鍏朵粬鍒楁敼鍙橈紝娓告爣涓暟鎹笉鍙樸 + +娓告爣鐨勪娇鐢 +鍒涘缓娓告爣锛 + +--1.鍒涘缓娓告爣(Scroll浠h〃婊氬姩娓告爣锛屼笉鍔燬croll鍒欐槸鍙繘鐨勶紝鍙兘鏀寔fetch next) +declare <娓告爣鍚> cursor scroll for select stuname from stuinfo +鎵撳紑娓告爣锛 + +open <娓告爣鍚> +鍏抽棴娓告爣锛 + +close <娓告爣鍚> +閲婃斁娓告爣锛 + +deallocate <娓告爣鍚> +鎻愬彇鏁版嵁鎿嶄綔锛 + +fetch first from <娓告爣鍚> --缁撴灉闆嗙殑绗竴琛 +fetch last from <娓告爣鍚> --鏈鍚庝竴琛 +fetch absolute 1 from <娓告爣鍚> --浠庢父鏍囩殑绗竴琛屽紑濮嬫暟锛岀n琛屻 +fetch relative 3 from <娓告爣鍚> --浠庡綋鍓嶄綅缃暟锛岀n琛屻 +fetch next from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笅涓琛 +fetch prior from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笂涓琛 +渚嬪瓙锛 + +浣跨敤娓告爣瀹炵幇鍔犺柂鎿嶄綔 +use test_trigger +select * from People + + + --- 1.澹版槑娓告爣 + -- 1.1婊氬姩娓告爣 (scroll) +declare cur_UpdateSalaryById cursor scroll +for select PeopleId from People + + -- 2.鎵撳紑娓告爣 +open cur_UpdateSalaryById + -- 3 浣跨敤娓告爣 + --澹版槑鍙橀噺鏉ユ帴鍙楁父鏍囨斁鍥炵殑鍊 涓 瀛樻斁鍔犺柂鍊 +declare @id int +declare @money money = 1000 + -- 娉ㄦ剰浜嬮」锛 浣跨敤鍙橀噺瀛樺偍娓告爣鍊肩殑鏍煎紡 fetch ... from 娓告爣鍚 into 鍙橀噺鍚 +fetch first from cur_UpdateSalaryById into @id + --@@fetch_status = 0 : 杩樻湁涓嬩竴琛 -1: 鎻愬彇澶辫触 -2:鎻愬彇绌虹櫧琛 + -- 姣忎汉閮藉姞钖1000 +while(@@fetch_status = 0) + begin + update People set PeopleSalary += @money where PeopleId = @id + print cast(@id as varchar(12)) + char(9) + cast(@money as varchar(20)) + fetch next from cur_UpdateSalaryById into @id + end + + -- 4.鍏抽棴娓告爣 +close cur_UpdateSalaryById + + -- 5.閲婃斁鍙橀噺 +deallocate cur_UpdateSalaryById \ No newline at end of file diff --git "a/40\345\274\240\350\200\200\344\273\201/\347\254\224\350\256\260/1006\347\254\224\350\256\260.txt" "b/40\345\274\240\350\200\200\344\273\201/\347\254\224\350\256\260/1006\347\254\224\350\256\260.txt" new file mode 100644 index 0000000000000000000000000000000000000000..c411de09ed43f0e92cd477722caaf49989a3181e --- /dev/null +++ "b/40\345\274\240\350\200\200\344\273\201/\347\254\224\350\256\260/1006\347\254\224\350\256\260.txt" @@ -0,0 +1,109 @@ +鍑芥暟鍒嗕负锛1锛夌郴缁熷嚱鏁:锛岋紙2锛夎嚜瀹氫箟鍑芥暟(鏂规硶锛氬皢涓涓姛鑳藉皝瑁呮垚鍙噸鐢ㄧ殑鍑芥暟)銆 + +鍏朵腑鑷畾涔夊嚱鏁板張鍙互鍒嗕负锛1锛夋爣閲忓煎嚱鏁帮紙杩斿洖鍗曚釜鍊硷級锛岋紙2锛夎〃鍊煎嚱鏁帮紙杩斿洖鏌ヨ缁撴灉锛 + +鏈枃涓昏浠嬬粛鑷畾涔夊嚱鏁扮殑浣跨敤銆 + +鏍囬噺鍊煎嚱鏁 +璇硶缁撴瀯锛 + +CREATE FUNCTION function_name(@parameter_name parameter_data_type) --锛園鍙傛暟鍚 鍙傛暟鐨勬暟鎹被鍨嬶級 +RETURNS date_type --杩斿洖杩斿洖鍊肩殑鏁版嵁绫诲瀷 + +[AS] + +BEGIN + + function_body --鍑芥暟浣 + + RETURN 琛ㄨ揪寮; --蹇呴』瑕佹湁鐨 + +END +瀹氫箟鍑芥暟瑕佹眰瀹炵幇: + +瀹炵幇涓や釜鍊肩殑鍔犲拰 + +浣跨敤鍑芥暟姹傛煇闂ㄨ鐨勫钩鍧囨垚缁 + +琛ㄥ煎嚱鏁 +璇硶缁撴瀯: + +create function 鍚嶇О + +([{@鍙傛暟鍚嶇О 鍙傛暟绫诲瀷[=榛樿鍊糫}[,n]]) + +returns @灞閮ㄥ彉閲 table锛堝弬鏁板悕 鍙傛暟绫诲瀷锛 + +[with encryption] + +[as] + +begin + +鍑芥暟浣 + +return 鍑芥暟杩斿洖鍊 + +end +鍒犻櫎鑷畾涔夊嚱鏁 + +DROP function 鍑芥暟鍚 +渚嬮锛 + +--锛1锛夌紪鍐欎竴涓嚱鏁版眰璇ラ摱琛岀殑閲戦鎬诲拰 +use BankTest +go +create function func_GetBankMoneyByAccId() +returns money +as +begin + declare @SumBankMoney money + select @SumBankMoney =(select sum(CardMoney ) from BankCard) + return @SumBankMoney +end +go + + +select dbo.func_GetBankMoneyByAccId() as 閾惰閲戦鎬诲拰 + + +--锛2锛変紶鍏ヨ处鎴风紪鍙凤紝杩斿洖璐︽埛鐪熷疄濮撳悕 +go +create function func_GetInfoByAcco_Id(@id int) +returns varchar(40) +as +begin + declare @name varchar(40) + select @name = (select RealName from AccountInfo where AccountId = @id) + return @name +end +go + +select dbo.func_GetInfoByAcco_Id( 2 ) as 濮撳悕 + + +--锛3锛変紶閫掑紑濮嬫椂闂村拰缁撴潫鏃堕棿锛岃繑鍥炰氦鏄撹褰曪紙瀛橀挶鍙栭挶锛夛紝浜ゆ槗璁板綍涓寘鍚 鐪熷疄濮撳悕锛屽崱鍙凤紝瀛橀挶閲戦锛屽彇閽遍噾棰濓紝浜ゆ槗鏃堕棿銆 + +--鏂规涓锛堥昏緫澶嶆潅锛屽嚱鏁板唴瀹归櫎浜嗚繑鍥炵粨鏋滅殑sql璇彞杩樻湁鍏朵粬鍐呭锛屼緥濡傚畾涔夊彉閲忕瓑锛夛細 + +go +create function func_GetCardExchangeByOpenTimeAndEndTime(@OpenTime smalldatetime,@EndTime smalldatetime) +returns @ExchangTable table( + Name varchar(30), + CardNo varchar(50), + MoneyInBank money, + MoneyOutBank money, + ExchangeTime smalldatetime +) +as +begin + insert into @ExchangTable + select A.RealName,CE.CardNo,CE.MoneyInBank,CE.MoneyOutBank,CE.ExchangeTime from CardExchange CE + join BankCard B on B.CardNo = CE.CardNo + join AccountInfo A on A.AccountId = B.AccountId + where A.OpenTime = @OpenTime and CE.ExchangeTime = @EndTime + return +end +go + +select * from func_GetCardExchangeByOpenTimeAndEndTime('2022-09-19 22:37:00','2022-09-19 22:37:00') diff --git "a/40\345\274\240\350\200\200\344\273\201/\347\254\224\350\256\260/\345\255\230\345\202\250\350\277\207\347\250\213.sql" "b/40\345\274\240\350\200\200\344\273\201/\347\254\224\350\256\260/\345\255\230\345\202\250\350\277\207\347\250\213.sql" new file mode 100644 index 0000000000000000000000000000000000000000..4fb12ff225eb5a412fff66d3d259549793da5bdc --- /dev/null +++ "b/40\345\274\240\350\200\200\344\273\201/\347\254\224\350\256\260/\345\255\230\345\202\250\350\277\207\347\250\213.sql" @@ -0,0 +1,163 @@ +--execute:执行 +exec sp_databases --查看所有数据库 + +exec sp_tables --查看所有 + +exec sp_columns course + + +exec sp_password '123456','654321' + + +use studenttest +go +--没有输入,输出参数 procedure +--1. 定义存储过程查询学生姓名,年龄最小的学生信息 +create proc proc_GetMinAge +as +begin + select stuname, stuage from stuinfo where stuage = (select min(stuage) from stuinfo) +end + + +--drop procedure proc_GetMinAge + +exec proc_GetMinAge + + +--2.有输入参数,无输出参数, +-- 定义存储过程查询学生信息 +go +create proc proc_GetMinAgeByName +@stuName varchar(20) +as +begin + select * from stuinfo where stuname=@stuName +end +go + +exec proc_GetMinAgeByName '张三丰' + +--3.有输入参数,无输出参数, 有返回值:只返回 整型数据 函数:1.返回标量值(任意数据类型) 2.表值函数(返回一张表) +go +create proc proc_GetMinAgeById +@stuNo varchar(20) +as +begin + declare @age int + select @age=stuage from stuinfo where stuNo=@stuNo + set @stuNo = 'S2022' + return @age +end +go + +--drop procedure proc_GetMinAgeById + +--定义@age接收返回的值 +declare @age int +declare @stuid varchar(20) = 's2001' +exec @age = proc_GetMinAgeById @stuid +print @age +print @stuid + + + +--传入学生学号,返回姓名 +go +create proc proc_GetMinAgeBystuid +@stuid varchar(20) +as +begin + declare @stuName varchar(20) + select @stuName=stuname from stuinfo where stuNo=@stuid + --返回的类型是 非整型数据类型 此存储过程无效 + return @stuname +end +go + +--外部 +declare @name varchar(20) +exec @name = proc_GetMinAgeBystuid 'S2001' +print @name + + + +--4.有输入参数,有输出参数(引用数据类型) +--输入学号(stunum),定义存储过程实现输出学生信息 name school major +use STUDENTS +go + + +create proc proc_GetStuInfoById +@stuNum varchar(20), +@name varchar(20) output, --输出参数 +@school varchar(20) output, +@major varchar(20) output +as +begin + select @name=name, @school=school,@major=major from tb_student where stu_num=@stunum +end + +--定义四个变量 +declare @stunum varchar(20) = '16130203' +declare @name varchar(20),@school varchar(20),@major varchar(20) + +exec proc_GetStuInfoById @stunum,@name output, @school output , @major output +print @name + char(9) + @school + char(9) + @major + + + + + + + + + + + + + + + + +--5.一个变量同时具备输入,输出参数的存储过程 +go +create proc proc_GetMinAgeBystuNo +@stuNo varchar(20) output --output代表是输出参数 +as +begin + declare @age int + set @stuNo = 'S2022' +end +go + +declare @stuno varchar(20) = 'S2001' + +exec proc_GetMinAgeBystuNo @stuno output +print @stuno + + +--查询出某时间段的银行存取款信息以及存款总金额**,取款总金额, +--传入开始时间,结束时间,显示存取款交易信息的同时,返回存款总金额,取款总金额。 +use BankTest +go + +select * from cardExchange + + +create proc GetMoneyByTime +@startTime smalldatetime, +@endTime smalldatetime, +@TotalSaveMoney money output, +@TotalWithdrawMoney money output +as +begin + select @TotalSaveMoney = sum(MoneyInBank),@TotalWithdrawMoney=sum(MoneyOutBank) from cardExchange + where ExchangeTime between @startTime and @endTime +end + +-- +declare @startTime smalldatetime = '2022-09-07',@endTime smalldatetime = '2022-09-18' +declare @TotalSaveMoney money,@TotalWithdrawMoney money +exec GetMoneyByTime @startTime,@endTime,@TotalSaveMoney output , @TotalWithdrawMoney output +select @TotalSaveMoney 存款总额,@TotalWithdrawMoney 取款总额 \ No newline at end of file