SQL Server 存儲過程

SQL Server 存儲過程

Transact-SQL中的存儲過程,非常類似於Java語言中的方法,它可以重複調用。當存儲過程執行一次後,可以將語句緩存中,這樣下次執行的時候直接使用緩存中的語句。這樣就可以提高存儲過程的性能。

存儲過程的概念

    存儲過程Procedure是一組爲了完成特定功能的SQL語句集合,經編譯後存儲在數據庫中,用戶通過指定存儲過程的名稱並給出參數來執行。

    存儲過程中可以包含邏輯控制語句和數據操縱語句,它可以接受參數、輸出參數、返回單個或多個結果集以及返回值。

    由於存儲過程在創建時即在數據庫服務器上進行了編譯並存儲在數據庫中,所以存儲過程運行要比單個的SQL語句塊要快。同時由於在調用時只需用提供存儲過程名和必要的參數信息,所以在一定程度上也可以減少網絡流量、簡單網絡負擔。

 

    1、 存儲過程的優點

        A、 存儲過程允許標準組件式編程

        存儲過程創建後可以在程序中被多次調用執行,而不必重新編寫該存儲過程的SQL語句。而且數據庫專業人員可以隨時對存儲過程進行修改,但對應用程序源代碼卻毫無影響,從而極大的提高了程序的可移植性。

        B、 存儲過程能夠實現較快的執行速度

        如果某一操作包含大量的T-SQL語句代碼,分別被多次執行,那麼存儲過程要比批處理的執行速度快得多。因爲存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進行分析、優化,並給出最終被存在系統表中的存儲計劃。而批處理的T-SQL語句每次運行都需要預編譯和優化,所以速度就要慢一些。

        C、 存儲過程減輕網絡流量

        對於同一個針對數據庫對象的操作,如果這一操作所涉及到的T-SQL語句被組織成一存儲過程,那麼當在客戶機上調用該存儲過程時,網絡中傳遞的只是該調用語句,否則將會是多條SQL語句。從而減輕了網絡流量,降低了網絡負載。

        D、 存儲過程可被作爲一種安全機制來充分利用

        系統管理員可以對執行的某一個存儲過程進行權限限制,從而能夠實現對某些數據訪問的限制,避免非授權用戶對數據的訪問,保證數據的安全。

 

系統存儲過程

    系統存儲過程是系統創建的存儲過程,目的在於能夠方便的從系統表中查詢信息或完成與更新數據庫表相關的管理任務或其他的系統管理任務。系統存儲過程主要存儲在master數據庫中,以“sp”下劃線開頭的存儲過程。儘管這些系統存儲過程在master數據庫中,但我們在其他數據庫還是可以調用系統存儲過程。有一些系統存儲過程會在創建新的數據庫的時候被自動創建在當前數據庫中。

    常用系統存儲過程有:

 sp_databases; --查看數據庫
 sp_tables;        --查看錶
 sp_columns student;--查看列
 sp_helpIndex student;--查看索引
 sp_helpConstraint student;--約束
 sp_stored_procedures;
 sp_helptext ;--查看存儲過程創建、定義語句
 sp_rename student, stuInfo;--修改表、索引、列的名稱
 sp_renamedb myTempDB, myDB;--更改數據庫名稱
 sp_defaultdb , ;--更改登錄名的默認數據庫
 sp_helpdb;--數據庫幫助,查詢數據庫信息
 sp_helpdb master;


    系統存儲過程示例:

--表重命名
 sp_rename , ;
 *  stud;
--列重命名
 sp_rename , , ;
 sp_help ;
--重命名索引
 sp_rename N, N, N;
 sp_help ;

--查詢所有存儲過程
 *  sys.objects  type = ;
 *  sys.objects  type_desc    name  ;

 

用戶自定義存儲過程

   1、 創建語法

  |  pro_name
    [{@參數數據類型} [=默認值] [],
     {@參數數據類型} [=默認值] [],
     ....
    ]

    SQL_statements

 

   2、 創建不帶參數存儲過程

--創建存儲過程
 ( ( *  sys.objects  name = ))
      proc_get_student

  proc_get_student

     *  student;

--調用、執行存儲過程
 proc_get_student;


   3、 修改存儲過程

--修改存儲過程
  proc_get_student

 *  student;


   4、 帶參存儲過程

--帶參存儲過程
 (object_id(, )   )
      proc_find_stu

  proc_find_stu(@startId , @endId )

     *  student  id  @startId  @endId


 proc_find_stu 2, 4;


   5、 帶通配符參數存儲過程

--帶通配符參數存儲過程
 (object_id(, )   )
      proc_findStudentByName

  proc_findStudentByName(@name (20) = , @nextName (20) = )

     *  student  name  @name  name  @nextName;


 proc_findStudentByName;
 proc_findStudentByName , ;


   6、 帶輸出參數存儲過程

 (object_id(, )   )
      proc_getStudentRecord

  proc_getStudentRecord(
    @id , --默認輸入參數
    @name (20) , --輸出參數
    @age (20) --輸入輸出參數
)

     @name = name, @age = age   student  id = @id  sex = @age;



 @id ,
        @name (20),
        @temp (20);
 @id = 7; 
 @temp = 1;
 proc_getStudentRecord @id, @name , @temp ;
 @name, @temp;
 @name +  + @temp;


   7、 不緩存存儲過程

-- RECOMPILE 不緩存
 (object_id(, )   )
      proc_temp

  proc_temp
 recompile

     *  student;


 proc_temp;


   8、 加密存儲過程

--加密WITH ENCRYPTION 
 (object_id(, )   )
      proc_temp_encryption

  proc_temp_encryption
 encryption

     *  student;


 proc_temp_encryption;
 sp_helptext ;
 sp_helptext ;


   9、 帶遊標參數存儲過程

 (object_id(, )   )
      proc_cursor

  proc_cursor
    @cur   

     @cur =  forward_only  
     id, name, age  student;
     @cur;

--調用
 @exec_cur ;
 @id ,
        @name (20),
        @age ;
 proc_cursor @cur = @exec_cur ;--調用存儲過程
   @exec_cur  @id, @name, @age;
 (@@fetch_status = 0)

       @exec_cur  @id, @name, @age;
      + (, @id) +  + @name +  + (, @age);

 @exec_cur;
 @exec_cur;--刪除遊標


   10、 分頁存儲過程

---存儲過程、row_number完成分頁
 (object_id(, )   )
      proc_cursor

  pro_page
    @startIndex ,
    @endIndex 

     (*)  product
;    
     *  (
         row_number() (  pid)  rowId, *  product 
    ) temp
     temp.rowId  @startIndex  @endIndex

--  pro_page
 pro_page 1, 4


 (object_id(, )   )
      pro_stu

  pro_stu(
    @pageIndex ,
    @pageSize 
)

     @startRow , @endRow 
     @startRow = (@pageIndex - 1) * @pageSize +1
     @endRow = @startRow + @pageSize -1
     *  (
         *, row_number()  (  id )  number  student 
    ) t
     t.number  @startRow  @endRow;

 pro_stu 2, 2;


Raiserror

Raiserror返回用戶定義的錯誤信息,可以指定嚴重級別,設置系統變量記錄所發生的錯誤。

   語法如下:

({msg_id | msg_str | @local_variable}
  {, severity, }
  [,argument[,…n]]
  [ [,…n]]
)


   # msg_id:在sysmessages系統表中指定的用戶定義錯誤信息

   # msg_str:用戶定義的信息,信息最大長度在2047個字符。

   # severity:用戶定義與該消息關聯的嚴重級別。當使用msg_id引發使用sp_addmessage創建的用戶定義消息時,raiserror上指定嚴重性將覆蓋sp_addmessage中定義的嚴重性。

    任何用戶可以指定0-18直接的嚴重級別。只有sysadmin固定服務器角色常用或具有alter trace權限的用戶才能指定19-25直接的嚴重級別。19-25之間的安全級別需要使用with log選項。

   # state:介於1至127直接的任何整數。State默認值是1。

(, 16, 1);
 *  sys.messages;
--使用sysmessages中定義的消息
(33003, 16, 1);
(33006, 16, 1);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章