存儲過程腳本彙總

  1. --1.1創建無參數存儲過程  
  2. --這個存儲過程的定義很像視圖定義  
  3. create procedure dbo.usp_wct  
  4. as  
  5.   
  6. select wcId,  
  7.        wcV,  
  8.        wcDate  
  9. from wcT  
  10. go  
  11.   
  12. --1.2執行存儲過程  
  13. exec dbo.usp_wct  
  14.   
  15.   
  16.   
  17. --2.1創建帶參數的存儲過程  
  18. create procedure dbo.usp_param_wct  
  19. (@wcId bigint =1,        --默認值爲1  
  20.  @wcDate datetime =null--默認值爲null  
  21. as  
  22.   
  23. select wcV  
  24. from dbo.wcT  
  25. where wcId = @wcId  
  26.       and isnull(@wcDate,1)=case when @wcdate is null  
  27.                                       then 1   
  28.                                  else wcDate  
  29.                             end  
  30.   
  31. --返回狀態值,一般不用於返回計算結果,而是用來返回表明存儲過程執行的狀態        
  32. return 1   
  33.   
  34. go  
  35.   
  36.   
  37. --2.2.1調用存儲過程  
  38. exec dbo.usp_param_wct '1','2012-07-01'  
  39.   
  40. --2.2.2調用存儲過程,帶參數名  
  41. exec dbo.usp_param_wct @wcid='1',  
  42.                        @wcdate='2012-07-01'  
  43.   
  44. --2.2.3調用存儲過程,帶參數名,只輸入一個參數值,另一個會使用默認值  
  45. exec dbo.usp_param_wct @wcid='1'  
  46.   
  47. --2.2.4調用存儲過程,帶參數名,不輸入參數,2個參數都會使用默認值  
  48. exec dbo.usp_param_wct   
  49.   
  50.   
  51.   
  52. --3.1創建帶output參數的存儲過程  
  53. create procedure dbo.usp_output_param_wct  
  54. (@wcId bigint =1,            --默認值爲1  
  55.  @wcDate datetime =null,     --默認值爲null  
  56.  @wcV varchar(50) output)    --輸出參數,用來返回計算結果  
  57. as  
  58.   
  59. select @wcV = wcV  
  60. from dbo.wcT  
  61. where wcId = @wcId  
  62.       and isnull(@wcDate,1)=case when @wcdate is null  
  63.                                       then 1   
  64.                                  else wcDate  
  65.                             end  
  66.   
  67. --返回狀態值,一般不用於返回計算結果,而是用來返回表明存儲過程執行的狀態        
  68. return 1   
  69.   
  70. go  
  71.   
  72.   
  73. --3.2調用存儲過程  
  74. declare @output varchar(50)  
  75.   
  76. exec dbo.usp_output_param_wct @wcId =1,         --輸入參數  
  77.                               --@wcDate = null,  
  78.                               @wcv = @output output       --輸出參數,存放返回值  
  79.   
  80. print @output    
  81.   
  82.   
  83.   
  84. --4.1修改存儲過程  
  85. create procedure dbo.usp_output_param_wct  
  86. (@wcId bigint =1,            --默認值爲1  
  87.  @wcDate datetime =null,     --默認值爲null  
  88.  @wcV varchar(50) output)    --輸出參數,用來返回計算結果  
  89. with encryption --加密存儲過程  
  90. as  
  91.   
  92. select @wcV = wcV  
  93. from dbo.wcT  
  94. where wcId = @wcId  
  95.       and isnull(@wcDate,1)=case when @wcdate is null  
  96.                                       then 1   
  97.                                  else wcDate  
  98.                             end  
  99.   
  100. --返回狀態值,一般不用於返回計算結果,而是用來返回表明存儲過程執行的狀態        
  101. return 1   
  102.   
  103. go        
  104.   
  105. --4.2查看定義  
  106. select object_name(object_id),  
  107.        definition                --顯示爲NULL  
  108. from sys.sql_modules  
  109. where object_id = object_id('dbo.usp_output_param_wct')   
  110.   
  111.   
  112.   
  113. --5.在SQL Server啓動時自動執行存儲過程  
  114. create procedure dbo.create_table    
  115. as  
  116.    select * into wc.dbo.wcX  
  117.    from wc.dbo.wcT  
  118. go  
  119.   
  120. --5.1設置爲true,在SQL Server啓動時自動執行存儲過程  
  121. exec sp_procoption @procname   = 'dbo.create_table',  
  122.                    @optionname = 'startup',  
  123.                    @optionvalue= 'true'  
  124.                      
  125. --5.2設置爲false來禁止  
  126. --只有dbo擁有的master數據庫中的對象才能更改啓動設置。  
  127. use master  
  128. go  
  129.   
  130. exec sp_procoption @procname   = 'dbo.create_table',  
  131.                    @optionname = 'startup',  
  132.                    @optionvalue= 'false'  
  133.   
  134.   
  135.   
  136. --6.1每次存儲過程執行時都重新編譯  
  137. --需要注意的是:當表、索引數據大量更新時,會進行語句級別的重新編譯  
  138. create procedure dbo.usp_backupset_info  
  139. (@startDate datetime,  
  140.  @finishDate datetime)  
  141. with recompile     --不保存執行計劃,每次都是重新編譯  
  142. as  
  143.   
  144. select SUM(backup_size)/1024/1024/1024 as 'GB'  
  145. from msdb.dbo.backupset  
  146. where backup_start_date >= @startDate  
  147.       and backup_finish_date <= @finishDate  
  148.       and type = 'D'  --數據庫備份,不是日誌備份或差異備份  
  149. go  
  150.   
  151.   
  152. --6.2清空過程緩存  
  153. select *  
  154. from sys.dm_exec_cached_plans  
  155.   
  156. dbcc freeproccache      --清空過程緩存  
  157.   
  158. --再次查詢發現都已經清空  
  159. select *  
  160. from sys.dm_exec_cached_plans  
  161.   
  162.   
  163.   
  164. --7.刷新存儲過程,查看元數據  
  165. exec sp_refreshsqlmodule @name ='dbo.usp_output_param_wct'  
  166.   
  167. select p.name,           --存儲過程名稱  
  168.        p.object_id,  
  169.          
  170.        pp.parameter_id,     
  171.        pp.name,          --參數名稱  
  172.        pp.default_value, --好像不起作用  
  173.        t.name            --參數列的類型  
  174. from sys.procedures p  
  175. inner join sys.parameters pp  
  176.         on pp.object_id = p.object_id  
  177. inner join sys.types t  
  178.         on t.system_type_id = pp.system_type_id  
  179. where p.object_id =965578478  
  180.   
  181.   
  182. --8.刪除存儲過程  
  183. DROP PROCEDURE dbo.usp_output_param_wct  
  184.               

存儲過程的Execute as選項
 

[sql] view plain copy
  1. --1.創建表  
  2. create table dbo.wcE  
  3.     (vid int not null primary key clustered,  
  4.      v int not null  
  5.     )  
  6.   
  7. insert into dbo.wcE  
  8. values(1,100),  
  9.       (2,200),  
  10.       (3,300)  
  11.   
  12.   
  13. --2.創建存儲過程,存儲過程的架構與存儲過程中引用對象的架構一樣  
  14. create procedure dbo.usp_delete_wcE  
  15. as  
  16.   
  17. delete from dbo.wcE  
  18. go  
  19.   
  20.   
  21. --3.1創建登錄名  
  22. create login wclogin with password = 'wclogin123'  
  23.   
  24.   
  25. --3.2創建數據庫用戶  
  26. create user wclogin  
  27.   
  28.   
  29.   
  30. --4.授予用戶執行存儲過程的權限  
  31. grant exec on dbo.usp_delete_wcE to wclogin   
  32.   
  33. grant connect  to wclogin  
  34.   
  35.   
  36.   
  37. /*====================================================  
  38. 5.1打開另一個客戶端,以wclogin登錄名登進去,然後執行存儲過程,  
  39. 雖然這個用戶沒有訪問存儲過程中所引用表的權限,  
  40. 但是由於存儲過程的架構與存儲過程中引用對象的架構一樣,  
  41. 同時由於存儲過程中只能是insertupdatedeleteselect,  
  42. 而不能是trancate等操作,這就是所有權鏈,所以沒有報錯.  
  43.   
  44. 特別需要注意的是:以上的所有權鏈對於動態的SQL是無效的.  
  45. ======================================================*/  
  46. exec dbo.usp_delete_wcE  
  47.   
  48. --5.2這裏改爲truncate後,會報錯  
  49. alter procedure dbo.usp_delete_wcE  
  50. as  
  51.   
  52. truncate table dbo.wcE  
  53. go  
  54.   
  55.   
  56.   
  57. --6.1使用execute as owner指定存儲過程的任何調用,  
  58. --都是在存儲過程架構的擁有者的安全上下文運行的  
  59. --這時再次以wclogin登錄就可以執行存儲過程而不會報錯  
  60. alter procedure dbo.usp_delete_wcE  
  61. with execute as owner  
  62. as  
  63.   
  64. truncate table dbo.wcE  
  65. go  
  66.   
  67.   
  68. --6.2以執行用戶的權限來執行存儲過程  
  69. --在以wclogin登錄執行時會報錯  
  70. alter procedure dbo.usp_delete_wcE  
  71. with execute as caller  
  72. as  
  73.   
  74. truncate table dbo.wcE  
  75. go  
  76.   
  77. --6.3以創建或最近一次更新存儲過程的用戶的權限來執行存儲過程,  
  78. --在以wclogin登錄執行時會報錯  
  79. alter procedure dbo.usp_delete_wcE  
  80. with execute as self  
  81. as  
  82.   
  83. truncate table dbo.wcE  
  84. go  
  85.   
  86.   
  87. --6.4以指定的用戶的權限來執行存儲過程,  
  88. --在以wclogin登錄執行時顯然不會報錯  
  89. alter procedure dbo.usp_delete_wcE  
  90. with execute as 'dbo'  
  91. as  
  92.   
  93. truncate table dbo.wcE  
  94. go  
  95.   
  96.   
  97.   
  98. --6.5這個存儲過程用了動態的SQL語句  
  99. create procedure dbo.w  
  100. as  
  101.   
  102. exec('select * from dbo.wcE');  
  103. go  
  104.   
  105. grant exec on dbo.w to wclogin  
  106.   
  107.   
  108. --在客戶端以wclogin登錄,執行時會報錯  
  109. --拒絕了對對象'wcE'(數據庫'wc',架構'dbo')的SELECT權限。  
  110. exec dbo.w  

 

 

[sql] view plain copy
  1. --1.函數  
  2. if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')  
  3.    drop function dbo.f_splitSTR  
  4. go  
  5.   
  6. create function dbo.f_splitSTR  
  7. (  
  8.     @s varchar(8000),     --要分拆的字符串  
  9.     @split varchar(10)    --分隔字符  
  10. )   
  11. returns @re table(                      --要返回的臨時表  
  12.                      col varchar(1000)  --臨時表中的列   
  13.                  )  
  14. as  
  15. begin     
  16.   declare @len int  
  17.     
  18.   set @len = LEN(@split)      --分隔符不一定就是一個字符,可能是2個字符  
  19.     
  20.   while CHARINDEX(@split,@s) >0  
  21.   begin  
  22.     insert into @re   
  23.     values(left(@s,charindex(@split,@s) - 1))  
  24.       
  25.     set @s = STUFF(@s,1,charindex(@split,@s) - 1 + @len ,'')    --覆蓋:字符串以及分隔符  
  26.   end  
  27.     
  28.   insert into @re values(@s)  
  29.     
  30.   return   --返回臨時表  
  31. end  
  32. go    
  33.   
  34.   
  35. select * from dbo.f_splitSTR('123,456',',')  
  36.   
  37.   
  38.   
  39. --2.存儲過程  
  40.   
  41. --創建類型  
  42. create type var_orgid as table  
  43. (  
  44. org_id numeric(10,0)  
  45. )  
  46.   
  47. --創建存儲過程  
  48. create proc usp_orgid  
  49. @orgid_table var_orgid readonly  
  50. as  
  51.   
  52. select * from @orgid_table  
  53. go  
  54.   
  55.   
  56. --定義表變量  
  57. declare @orgid_table as var_orgid  
  58.   
  59. insert into @orgid_table   
  60. values(123)  
  61.   
  62. exec usp_orgid @orgid_table  


 sp_executesql存儲過程,可以使動態語句重用,提高效率:

[sql] view plain copy
  1. DECLARE @sumcount INT  
  2. DECLARE @tmpSQL NVARCHAR(1000)  
  3. DECLARE @TABLENAME  VARCHAR(50)  
  4. SELECT @TABLENAME = ' sys.objects ' --表名變量賦值  
  5.   
  6. SELECT @tmpSQL = 'select @sum = convert(varchar(50),count(object_id)) from ' + @TABLENAME   
  7.   
  8.   
  9. /*  
  10. 參數1: 動態語句  
  11. 參數2:定義的參數,這個參數就是在動態語句中引用到的變量@sum  
  12. 參數3:指明瞭執行結果@sum的值,放到@sumcount參數裏面,  
  13.   
  14. 這裏需要特別注意的是,動態語句中的變量,和外面定義的變量,是不同的,  
  15. 下面的語句,實際相當於:  
  16.   
  17. declare @sum int   
  18.   
  19. select @sum = convert(varchar(50),count(object_id))   
  20. from  + 表名   
  21.   
  22. 所以,通過sp_executesql,可以把語句產生的結果輸出到外面的變量,  
  23. 這樣我們才能知道輸結果  
  24. */  
  25. exec sp_executesql @tmpsql,  
  26.                    N'@sum int output',  
  27.                    @sumcount out  
  28.   
  29. select @sumcount  

try catch 錯誤處理

[sql] view plain copy
  1. create proc proc_t(@i int)  
  2. as  
  3.   
  4. select 5 * 1.0 / @i  
  5. go  
  6.   
  7.   
  8. --1.不會報錯  
  9. begin try  
  10.     begin tran  
  11.         exec proc_t 1  
  12.         select '執行成功'  
  13.     commit tran  
  14. end try  
  15. begin catch  
  16.   select '執行失敗'  
  17.   if @@trancount >0   
  18.      rollback  
  19. end catch  
  20.   
  21.   
  22. --2.這次會報錯,因爲分母爲0  
  23. begin try  
  24.     begin tran  
  25.         exec proc_t 0  
  26.         select '執行成功'  
  27.     commit tran  
  28. end try  
  29. begin catch  
  30.   select '執行失敗'  
  31.   if @@trancount >0   
  32.      rollback  
  33. end catch  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章