From 9d97fef81b3adc302f38c48bb9e51f03d8facdef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98=E6=9D=8E=E9=9F=A6=E5=B3=B0=E2=80=99?= <2669441367@qq.com> Date: Thu, 6 Oct 2022 12:49:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=AC=AC=E4=B9=9D=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2022-09-30\346\270\270\346\240\207.sql" | 136 ++++++++++++++++++ .../2022-09-28\344\272\213\345\212\2412.md" | 68 +++++++++ .../2022-09-30\346\270\270\346\240\207.md" | 91 ++++++++++++ 3 files changed, 295 insertions(+) create mode 100644 "01\346\235\216\351\237\246\345\263\260/\344\275\234\344\270\232/2022-09-30\346\270\270\346\240\207.sql" create mode 100644 "01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-28\344\272\213\345\212\2412.md" create mode 100644 "01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-30\346\270\270\346\240\207.md" diff --git "a/01\346\235\216\351\237\246\345\263\260/\344\275\234\344\270\232/2022-09-30\346\270\270\346\240\207.sql" "b/01\346\235\216\351\237\246\345\263\260/\344\275\234\344\270\232/2022-09-30\346\270\270\346\240\207.sql" new file mode 100644 index 0000000..ca80d33 --- /dev/null +++ "b/01\346\235\216\351\237\246\345\263\260/\344\275\234\344\270\232/2022-09-30\346\270\270\346\240\207.sql" @@ -0,0 +1,136 @@ +--例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_Aid cursor scroll +for select id from A +declare cur_Bid cursor scroll +for select id from B + +open cur_Aid +open cur_Bid + +declare @Aid int +declare @Bid int +declare @Province varchar(20) = '' +declare @City varchar(20) = '' + +fetch first from cur_Aid into @Aid +fetch first from cur_Bid into @Bid + +while(@@FETCH_STATUS = 0) + begin + set @Province =(select Province from A where id = @Aid) + set @City =(select City from A where id = @Aid) + + + + + if(@Aid = @Bid) + begin + update B set Province = @Province where id = @Bid + update B set City = @City where id = @Bid + end + fetch next from cur_Aid into @Aid + fetch next from cru_Bid into @Bid + + + end + +close cur_Aid +close cur_Bid + +deallocate cur_Aid +deallocate cur_Bid \ No newline at end of file diff --git "a/01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-28\344\272\213\345\212\2412.md" "b/01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-28\344\272\213\345\212\2412.md" new file mode 100644 index 0000000..db8926f --- /dev/null +++ "b/01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-28\344\272\213\345\212\2412.md" @@ -0,0 +1,68 @@ +#### 浜嬪姟鍒嗙被 + +**鑷姩鎻愪氦浜嬬墿**锛 鏄疭QL Server榛樿鐨勪竴绉嶄簨鍔℃ā寮忥紝姣忔潯Sql璇彞閮借鐪嬫垚涓涓簨鍔¤繘琛屽鐞嗐 + +**鏄惧紡浜嬪姟**: T-sql鏍囨槑锛岀敱Begin Transaction寮鍚簨鍔″紑濮嬶紝鐢盋ommit Transaction 鎻愪氦浜嬪姟銆丷ollback Transaction 鍥炴粴浜嬪姟缁撴潫銆 + +**闅愬紡浜嬪姟**锛氫娇鐢⊿et IMPLICIT_TRANSACTIONS ON 灏嗗皢闅愬紡浜嬪姟妯″紡鎵撳紑锛屼笉鐢˙egin Transaction寮鍚簨鍔★紝褰撲竴涓簨鍔$粨鏉燂紝杩欎釜妯″紡浼氳嚜鍔ㄥ惎鐢ㄤ笅涓涓簨鍔★紝鍙敤Commit Transaction 鎻愪氦浜嬪姟銆丷ollback Transaction 鍥炴粴浜嬪姟鍗冲彲銆 + +TIPS: + +**浜嬬墿鍥炴粴**锛 + +xact_abort on/off : 涓簅n鏃跺鏋滃綋鍓峴ql鍑洪敊锛屽洖婊氭暣涓簨鍔★紝涓簅ff鏃跺鏋渟ql鍑洪敊鍥炴粴褰撳墠sql璇彞锛屽叾瀹冭鍙ョ収甯歌繍琛岃鍐欐暟鎹簱銆 + + + + + + + +## 浜嬪姟鐨勯殧绂荤骇鍒 + +#### 浜嬪姟鐨凙CID灞炴 + +鈥 Atomicity 鍘熷瓙鎬э細鍚屼竴涓簨鍔′腑鐨勬搷浣滐紝瑕佷箞鍏ㄩ儴鎴愬姛锛岃涔堝叏閮ㄥけ璐ャ + +鈥 Consistency 涓鑷存э細鏁版嵁搴撲腑鐨勬暟鎹繚璇佸悎娉曪紝婊¤冻鎵鏈夌殑绾︽潫锛堟瘮濡傚敮涓绾︽潫锛 + +鈥 Isolation **闅旂鎬**锛氫笉鍚岀殑浜嬪姟涓嶈兘鐩镐簰褰卞搷 + +鈥 Durability 鎸佷箙鎬э細浜嬪姟鎻愪氦鍚庯紝涓嶇鏁版嵁搴撴槸鍚﹀穿婧冮噸鍚紝鎻愪氦鐨勪簨鍔℃墍浣滃嚭鐨勪慨鏀归兘瑕佺敓鏁 + +濡傛灉涓嶅浜嬪姟杩涜闅旂锛屽涓簨鍔″悓鏃跺彂鐢熷湪鏁版嵁搴撲腑锛屽皢浼氬鑷翠互涓嬬殑闂锛 + +- **鑴忚**锛氫竴涓簨鍔¤鍙栧埌鍙︿竴涓湭鎻愪氦浜嬪姟鐨勪慨鏀广傛病淇濊瘉鍘熷瓙鎬э紝濡傛灉褰撳墠浜嬪姟鍩轰簬杩欎簺鑴忔暟鎹繘琛屾搷浣滐紝鍙︿竴涓簨鍔″洖婊氬悗锛岃繖浜涙搷浣滃皢浼氭槸閿欒鐨 +- **涓嶅彲閲嶅璇**锛氫簨鍔′腑锛屽彟澶栫殑浜嬪姟鎻愪氦浜唘pdate鎴杁elete锛屽鑷村綋鍓嶄簨鍔″墠鍚庤鍙栧埌鐨勬暟鎹笉涓鑷淬傛病淇濊瘉鎸佷箙鎬э紝浼氬鑷村綋鍓嶄簨鍔¤鐩栧彟澶栦簨鍔$殑淇敼 +- **骞昏**锛氫簨鍔′腑锛屽彟澶栫殑浜嬪姟鎻愪氦浜唅nsert锛屽鑷村綋鍓嶄簨鍔″墠鍚庤鍙栧埌鐨勬暟鎹婚噺涓嶄竴鑷淬傚綋鍓嶄簨鍔″厛瀵瑰敮涓绾︽潫杩涜妫鏌ュ彂鐜版病鏈変笌灏嗚鎻掑叆鐨勬暟鎹噸澶嶇殑锛屾鏃跺彟澶栫殑浜嬪姟鎻愪氦浜嗭紝瀵艰嚧褰撳墠浜嬪姟杩涜鎻掑叆鍚庢暟鎹簱涓湁涓ゆ潯鐩稿悓鐨勬暟鎹紝鐮寸幆浜嗕竴鑷存 + +#### 浜嬪姟鐨勫洓绉嶉殧绂荤骇鍒 + +**read-uncommitted** **璇绘湭鎻愪氦** + +鈥 鍙互璇诲埌鏈彁浜ょ殑鏁版嵁锛堝畬鍏ㄤ笉闅旂锛 + +**read-committed 璇诲凡鎻愪氦** + +鈥 鍙兘璇诲彇宸叉彁浜ょ殑鏁版嵁锛堥伩鍏嶈剰璇伙級 + +**repeatable-read 鍙噸澶嶈** + +鈥 鍙兘璇诲彇鍒颁簨鍔″紑濮嬪墠锛屽叾瀹冧簨鍔℃彁浜ょ殑鏁版嵁锛堥伩鍏嶈剰璇汇佷笉鍙噸澶嶈锛 + +**serializable 涓茶鍖** + +鈥 鎵鏈変簨鍔′竴涓竴涓墽琛岋紝涓嶈繘琛屽苟鍙(閬垮厤鑴忚銆佷笉鍙噸澶嶈銆佸够璇) + + + + + +```sql +--鏌ョ湅浜嬪姟鐨勯殧绂荤骇鍒 +dbcc useroptions +--璁剧疆浜嬪姟闅旂绾у埆 +set transaction isolation level <闅旂绾у埆> + +``` + diff --git "a/01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-30\346\270\270\346\240\207.md" "b/01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-30\346\270\270\346\240\207.md" new file mode 100644 index 0000000..954119d --- /dev/null +++ "b/01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-30\346\270\270\346\240\207.md" @@ -0,0 +1,91 @@ +## 娓告爣 + +#### 浠涔堟槸娓告爣 + +娓告爣(Cursor)瀹冧娇鐢ㄦ埛鍙愯璁块棶鐢盨QL Server杩斿洖鐨勭粨鏋滈泦銆備娇鐢ㄦ父鏍(cursor)鐨勪竴涓富瑕佺殑鍘熷洜灏辨槸鎶婇泦鍚堟搷浣滆浆鎹㈡垚**鍗曚釜璁板綍澶勭悊鏂瑰紡**銆傜敤SQL璇█浠庢暟鎹簱涓绱㈡暟鎹悗锛岀粨鏋滄斁鍦ㄥ唴瀛樼殑涓鍧楀尯鍩熶腑锛屼笖缁撴灉寰寰鏄竴涓惈鏈夊涓褰曠殑闆嗗悎銆傛父鏍囨満鍒跺厑璁哥敤鎴峰湪SQL server鍐呴愯鍦拌闂繖浜涜褰曪紝鎸夌収鐢ㄦ埛鑷繁鐨勬剰鎰挎潵鏄剧ず鍜屽鐞嗚繖浜涜褰曘 + +娓告爣鍒嗙被: + +锛1锛夐潤鎬佹父鏍(Static)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝鏁版嵁鍙戠敓鍙樺寲锛屾父鏍囦腑鏁版嵁涓嶅彉 +锛2锛夊姩鎬佹父鏍(Dynamic)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝鏁版嵁鍙戠敓鍙樺寲锛屾父鏍囦腑鏁版嵁鏀瑰彉锛岄粯璁ゅ笺 +锛3锛夐敭闆嗛┍鍔ㄦ父鏍(KeySet)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝琚爣璇嗙殑鍒楀彂鐢熸敼鍙橈紝娓告爣涓暟鎹敼鍙橈紝鍏朵粬鍒楁敼鍙橈紝娓告爣涓暟鎹笉鍙樸 + + + +#### 娓告爣鐨勪娇鐢 + +**鍒涘缓娓告爣锛** + +```sql +--1.鍒涘缓娓告爣(Scroll浠h〃婊氬姩娓告爣锛屼笉鍔燬croll鍒欐槸鍙繘鐨勶紝鍙兘鏀寔fetch next) +declare <娓告爣鍚> cursor scroll for select stuname from stuinfo +``` + +**鎵撳紑娓告爣锛** + +```sql +open <娓告爣鍚> +``` + +**鍏抽棴娓告爣锛** + +``` +close <娓告爣鍚> +``` + +**閲婃斁娓告爣锛** + +``` +deallocate <娓告爣鍚> +``` + + + +**鎻愬彇鏁版嵁鎿嶄綔锛** + +```sql +fetch first from <娓告爣鍚> --缁撴灉闆嗙殑绗竴琛 +fetch last from <娓告爣鍚> --鏈鍚庝竴琛 +fetch absolute 1 from <娓告爣鍚> --浠庢父鏍囩殑绗竴琛屽紑濮嬫暟锛岀n琛屻 +fetch relative 3 from <娓告爣鍚> --浠庡綋鍓嶄綅缃暟锛岀n琛屻 +fetch next from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笅涓琛 +fetch prior from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笂涓琛 +``` + +渚嬪瓙锛 + +```sql +浣跨敤娓告爣瀹炵幇鍔犺柂鎿嶄綔 +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 +``` + -- Gitee From fbdcc9923ef7d8cdbbec33b636c9d88e03673c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98=E6=9D=8E=E9=9F=A6=E5=B3=B0=E2=80=99?= <2669441367@qq.com> Date: Thu, 6 Oct 2022 12:51:18 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=AC=AC=E4=B9=9D=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2022-09-29\344\272\213\345\212\2412.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-28\344\272\213\345\212\2412.md" => "01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-29\344\272\213\345\212\2412.md" (100%) diff --git "a/01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-28\344\272\213\345\212\2412.md" "b/01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-29\344\272\213\345\212\2412.md" similarity index 100% rename from "01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-28\344\272\213\345\212\2412.md" rename to "01\346\235\216\351\237\246\345\263\260/\347\254\224\350\256\260/2022-09-29\344\272\213\345\212\2412.md" -- Gitee