資源描述:
《SQL_Server存儲(chǔ)過(guò)程學(xué)習(xí)總結(jié)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、SQLServer數(shù)據(jù)庫(kù):存儲(chǔ)過(guò)程學(xué)習(xí)總結(jié)一、SQLServer生成唯一值的方法NEWID()--SQLServer中生成唯一序列值的函數(shù)。SYS_GUID()--Oracle中生成唯一序列值的函數(shù)。二、事務(wù)的應(yīng)用TransactionSQLServer中的Transaction,需顯示開(kāi)啟,提交/回滾,且一個(gè)Transaction必須要有CommitTransaction/RollbackTransaction。且Commit/Rollback一定要在return之前。在存儲(chǔ)過(guò)程中試用Transaction的示例:IFEXISTS(SELECT*FROMSYSOBJECTSWHEREna
2、me='my_sp_test'ANDTYPE='P')BEGINDROPPROCEDUREmy_sp_test;END;GOcreateproceduremy_sp_test@iint,@outstrvarchar(100)outasbegintrybegintransaction--事務(wù)開(kāi)啟declare@jint;if@i<10beginset@outstr='直接Return,并未Commit或RollbackTransaction.';return;endelsebeginset@outstr='拋出自定義異常,并在異常捕獲處RollbackTransaction.';RAISER
3、ROR(66666,--Messageid.16,--Severity,1--State,);end;committransaction;--提交事務(wù)endtrybegincatchif@@ERROR=66666begin--判斷是否存在開(kāi)啟的事務(wù),避免如果事務(wù)在這之前已提交或者已回滾,再次回滾會(huì)拋異常if(@@TRANCOUNT<>0)beginrollbacktransaction;--事務(wù)回滾end;end;return;endcatch;go測(cè)試存儲(chǔ)過(guò)程,如下代碼:/*第一個(gè)入?yún)?12,不會(huì)產(chǎn)生異常*/DECLARE@OUTSTR_testVARCHAR(100);execdbo.
4、my_sp_test12,@OUTSTR_testoutprint@OUTSTR_test;--@OUTSTR_test='拋出自定義異常,并在異常捕獲處RollbackTransaction.'/*第一個(gè)入?yún)?8,執(zhí)行后則會(huì)出現(xiàn)異常,異常信息如下行*'EXECUTE后的事務(wù)計(jì)數(shù)指示BEGIN和COMMIT語(yǔ)句的數(shù)目不匹配。上一計(jì)數(shù)=0,當(dāng)前計(jì)數(shù)=1。'*/DECLARE@OUTSTR_test_1VARCHAR(100);execdbo.my_sp_test8,@OUTSTR_test_1outprint@OUTSTR_test_1;--@OUTSTR_test_1='直接Return,
5、并未Commit或RollbackTransaction.'/*入?yún)?的測(cè)試語(yǔ)句執(zhí)行后,之所以會(huì)出現(xiàn)異常,是因?yàn)锽eginTransaction后,在之后*的代碼中未對(duì)這個(gè)Transaction進(jìn)行Commit或者Rollback的操作。*/一、游標(biāo)的應(yīng)用CursorSQLServer中的游標(biāo)聲名后,一定要顯示的釋放。若未釋放,再次執(zhí)行時(shí),則會(huì)出現(xiàn)“游標(biāo)XX已經(jīng)存在”的異常。Open游標(biāo)后,一定要顯示的Close。在存儲(chǔ)過(guò)程中試用Cursor的示例:IFEXISTS(SELECT*FROMSYSOBJECTSWHEREname='my_sp_test'ANDTYPE='P')BEGIND
6、ROPPROCEDUREmy_sp_test;END;GOcreateproceduremy_sp_test@iint,@outstrvarchar(100)outasdeclare@loginNamevarchar(100);declarecur_usercursorforselectESUS_LOGIN_NAMEfromES_USERwhereESUS_ESCO_ID='100004';begintryopencur_user;--開(kāi)啟游標(biāo)fetchnextfromcur_userinto@loginName;while@@FETCH_STATUS=0beginif(@i>=10)be
7、ginset@outstr='loginname:'+@loginName;RAISERROR(66666,--Messageid.16,--Severity,1--State,);endelseif(@i<10)beginset@outstr='loginname:'+@loginName;end;fetchnextfromcur_userinto@loginName;end;closecur_user;--關(guān)閉游標(biāo)r