靈魂-放水

          為學日益,為道日損。

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            296 Posts :: 10 Stories :: 274 Comments :: 0 Trackbacks
          存儲過程的概念
          ? ??? ?SQL Server提供了一種方法,它可以將一些固定的操作集中起來由SQL Server數據庫服務器來完成,以實現某個任務,這種方法就是存儲過程。
          ? ???? 存儲過程是SQL語句和可選控制流語句的預編譯集合,存儲在數據庫中,可由應用程序通過一個調用執行,而且允許用戶聲明變量、有條件執行以及其他強大的編程功能。
          ? ???? 在SQL Server中存儲過程分為兩類:即系統提供的存儲過程和用戶自定義的存儲過程。

          ? ???? 可以出于任何使用SQL語句的目的來使用存儲過程,它具有以下優點:
          ? ?? ? 可以在單個存儲過程中執行一系列SQL語句。
          ? ?? ? 可以從自己的存儲過程內引用其他存儲過程,這可以簡化一系列復雜語句。
          ? ?? ? 存儲過程在創建時即在服務器上進行編譯,所以執行起來比單個SQL語句快,而且減少網絡通信的負擔。
          ? ?? ? 安全性更高。
          創建存儲過程

          ? ??? ?在SQL Server中,可以使用三種方法創建存儲過程 :
          ? ?? ?? ?①使用創建存儲過程向導創建存儲過程。
          ? ?? ?? ?②利用SQL Server 企業管理器創建存儲過程。
          ? ?? ?? ?③使用Transact-SQL語句中的CREATE PROCEDURE命令創建存儲過程。

          下面介紹使用Transact-SQL語句中的CREATE PROCEDURE命令創建存儲過程
          ? ? 創建存儲過程前,應該考慮下列幾個事項:
          ? ???①不能將 CREATE PROCEDURE 語句與其它 SQL 語句組合到單個批處理中。
          ? ???②存儲過程可以嵌套使用,嵌套的最大深度不能超過32層。
          ? ???③創建存儲過程的權限默認屬于數據庫所有者,該所有者可將此權限授予其他用戶。
          ? ???④存儲過程是數據庫對象,其名稱必須遵守標識符規則。
          ? ???⑤只能在當前數據庫中創建存儲過程。
          ? ???⑥ 一個存儲過程的最大尺寸為128M。

          使用CREATE PROCEDURE創建存儲過程的語法形式如下:

          QUOTE:
          CREATE PROC[EDURE]procedure_name[;number][;number]
          [{@parameter data_type}
          [VARYING][=default][OUTPUT]
          ][,...n] WITH? ?
          {RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
          [FOR REPLICATION]
          AS sql_statement [ ...n ]
          用CREATE PROCEDURE創建存儲過程的語法參數的意義如下:

          procedure_name:用于指定要創建的存儲過程的名稱。
          number:該參數是可選的整數,它用來對同名的存儲過程分組,以便用一條 DROP PROCEDURE 語句即可將同組的過程一起除去。
          @parameter:過程中的參數。在 CREATE PROCEDURE 語句中可以聲明一個或多個參數。
          data_type:用于指定參數的數據類型。
          VARYING:用于指定作為輸出OUTPUT參數支持的結果集。
          Default:用于指定參數的默認值。
          OUTPUT:表明該參數是一個返回參數。


          例如:下面創建一個 簡單的存儲過程productinfo,用于檢索產品信息。
          USE Northwind
          if exists(select name from sysobjects
          ? ?? ?? ? where name='productinfo' and type = 'p')
          ? ?drop procedure productinfo
          GO

          create??procedure productinfo
          as
          select * from products
          GO
          通過下述sql語句執行該存儲過程:execute productinfo
          即可檢索到產品信息。
          執行存儲過程

          直接執行存儲過程可以使用EXECUTE命令來執行,其語法形式如下:
          [[EXEC[UTE]]
          ? ?{? ?? ? [@return_status=]
          ? ?? ?? ? {procedure_name[;number]|@procedure_name_var}? ?? ?? ?? ?[[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]}? ?? ?
          ? ?? ?[,...n]
          [ WITH RECOMPILE ]



          使用 EXECUTE 命令傳遞單個參數,它執行 showind 存儲過程,以 titles 為參數值。showind 存儲過程需要參數 (@tabname),它是一個表的名稱。其程序清單如下:
          ? ? EXEC showind titles
          當然,在執行過程中變量可以顯式命名:
          ? ? EXEC showind @tabname = titles
          如果這是 isql 腳本或批處理中第一個語句,則 EXEC 語句可以省略:
          ? ? showind titles或者showind @tabname = titles



          下面的例子使用了默認參數
          USE Northwind
          GO
          CREATE PROCEDURE insert_Products_1
          ? ? ? ? ( @SupplierID_2 ? ? ? ? int,
          ? ? ? ???@CategoryID_3 ? ? ? ? int,
          ? ?? ?? ?? ?? ???@ProductName_1 nvarchar(40)='無')
          AS INSERT INTO Products
          ? ? ? ???(ProductName,SupplierID,CategoryID)
          VALUES
          ? ? ? ? (@ProductName_1,@SupplierID_2,@CategoryID_3)
          GO
          exec insert_Products_1 1,1
          Select * from Products where SupplierID=1 and CategoryID=1
          GO


          下面的例子使用了返回參數
          USE Northwind
          GO
          CREATE PROCEDURE query_products
          (? ?? ?@SupplierID_1 int,
          ? ?? ???@ProductName_2 nvarchar(40) output)
          AS
          select @ProductName_2 = ProductName? ?from products
          where SupplierID = @SupplierID_1

          執行該存儲過程來查詢SupplierID為1的產品名:
          declare @product nvarchar(40)
          exec query_products 1,@product output
          select '產品名'= @product
          go

          查看存儲過程
          ? ?存儲過程被創建之后,它的名字就存儲在系統表sysobjects中,它的源代碼存放在系統表syscomments中。可以使用使用企業管理器或系統存儲過程來查看用戶創建的存儲過程。


          使用企業管理器查看用戶創建的存儲過程

          ? ?在企業管理器中,打開指定的服務器和數據庫項,選擇要創建存儲過程的數據庫,單擊存儲過程文件夾,此時在右邊的頁框中顯示該數據庫的所有存儲過程。用右鍵單擊要查看的存儲過程,從彈出的快捷菜單中選擇屬性選項,此時便可以看到存儲過程的源代碼。


          使用系統存儲過程來查看用戶創建的存儲過程

          可供使用的系統存儲過程及其語法形式如下:
          sp_help:用于顯示存儲過程的參數及其數據類型
          ? ?sp_help [[@objname=] name]
          參數name為要查看的存儲過程的名稱。
          ? ?sp_helptext:用于顯示存儲過程的源代碼
          ? ?sp_helptext [[@objname=] name]
          參數name為要查看的存儲過程的名稱。
          ? ?sp_depends:用于顯示和存儲過程相關的數據庫對象
          ? ?sp_depends [@objname=]’object’
          參數object為要查看依賴關系的存儲過程的名稱。
          ? ?sp_stored_procedures:用于返回當前數據庫中的存儲過程列表





          修改存儲過程


          ? ? 存儲過程可以根據用戶的要求或者基表定義的改變而改變。使用ALTER PROCEDURE語句可以更改先前通過執行 CREATE PROCEDURE 語句創建的過程,但不會更改權限,也不影響相關的存儲過程或觸發器。其語法形式如下:
          ? ?ALTERPROC[EDURE]procedure_name[;number]
          [{@parameterdata_type}
          [VARYING][=default][OUTPUT]][,...n] [WITH
          ? ?{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
          [FOR REPLICATION]
          AS? ?
          sql_statement [ ...n ]

          重命名和刪除存儲過程

          1. 重命名存儲過程
          ??修改存儲過程的名稱可以使用系統存儲過程sp_rename,其語法形式如下:
          ? ?? ?sp_rename??原存儲過程名稱,新存儲過程名稱
          ? ?? ?另外,通過企業管理器也可以修改存儲過程的名稱。



          刪除存儲過程


          ? ?刪除存儲過程可以使用DROP命令,DROP命令可以將一個或者多個存儲過程或者存儲過程組從當前數據庫中刪除,其語法形式如下:
          ? ?? ? drop procedure {procedure} [,…n]
          當然,利用企業管理器也可以很方便地刪除存儲過程。



          存儲過程的重新編譯

          ? ?在我們使用了一次存儲過程后,可能會因為某些原因,必須向表中新增加數據列或者為表新添加索引,從而改變了數據庫的邏輯結構。這時,需要對存儲過程進行重新編譯,SQL Server提供三種重新編譯存儲過程的方法 :
          ? ? 1、在建立存儲過程時設定重新編譯
          ? ?? ? 語法格式:CREATE??PROCEDURE? ?procedure_name? ? WITH? ?RECOMPILE? ? AS? ?sql_statement
          ? ???2、在執行存儲過程時設定重編譯
          ? ?? ? 語法格式: EXECUTE??procedure_name??WITH??RECOMPILE
          ? ? 3、通過使用系統存儲過程設定重編譯
          ? ?? ???語法格式為:??EXEC??sp_recompile??OBJECT

          系統存儲過程與擴展存儲過程

          1.系統存儲過程
          ? ?? ?? ???系統存儲過程存儲在master數據庫中,并以sp_為前綴,主要用來從系統表中獲取信息,為系統管理員管理SQL Server提供幫助,為用戶查看數據庫對象提供方便。比如用來查看數據庫對象信息的系統存儲過程sp_help、顯示存儲過程和其它對象的文本的存儲過程sp_helptext等。


          2.擴展存儲過程:
          ? ?? ?? ? 擴展存儲過程以xp_為前綴,它是關系數據庫引擎的開放式數據服務層的一部分,其可以使用戶在動態鏈接庫(DLL)文件所包含的函數中實現邏輯,從而擴展了Transact-SQL的功能,并且可以象調用Transact-SQL過程那樣從Transact-SQL語句調用這些函數。
          ? ?? ?例:??利用擴展存儲過程xp_cmdshell為一個操作系統外殼執行指定命令串,并作為文本返回任何輸出。
          ? ?? ?執行代碼:
          ? ?? ?? ?use master
          ? ?? ?? ? exec xp_cmdshell 'dir *.exe'? ?
          ? ?? ? 執行結果返回系統目錄下的文件內容文本信息。

          最后給大家舉一個例子:

          QUOTE:
          /**
          1、? ? ? ? 在Northwind數據庫中,創建一個帶查詢參數的存儲過程,
          要求在輸入一個定購金額總額@total時,查詢超出該值的所
          有產品的相關信息,包括產品名稱和供應商名稱、單位數量、
          單價、以及該產品的定購金額總額,并通過一個輸出參數返回
          滿足查詢條件的產品數
          **/


          IF exists (select * from SysObjects where name='more_than_total' and type='p')
          ? ?drop procedure more_than_total
          go
          CREATE PROCEDURE More_Than_Total
          ? ? ? ? @total money = 0
          AS
          Declare @amount smallint
          BEGIN
          ? ? ? ? select distinct
          ? ?? ?? ???P.productName,
          ? ?? ?? ???S.contactName,
          ? ?? ?? ???P.UnitPrice
          ? ?? ?? ???
          ? ? from Products P inner join [order Details] O
          ? ?? ?? ?on p.productID=o.productID inner join suppliers s
          ? ?? ?? ?on p.supplierID=s.SupplierID
          ? ? where O.productID in
          ? ? (select productID
          ? ???from? ?[order Details]
          ? ???group by productId
          ? ???having sum(quantity*unitprice)>@total
          ? ? )
          END
          GO
          posted on 2007-01-08 11:01 放水老倌 閱讀(10728) 評論(4)  編輯  收藏 所屬分類: 數據庫

          Feedback

          # re: [轉]SQL2000存儲過程的基礎 2009-02-19 10:35 D3
          NO no NO no 繼續學習中  回復  更多評論
            

          # 好看的電影 2010-05-30 14:04 好看的電影
          太牛了  回復  更多評論
            

          # re: [轉]SQL2000存儲過程的基礎 2011-04-18 11:29 問題人
          很好的文章  回復  更多評論
            

          # re: [轉]SQL2000存儲過程的基礎 2011-04-18 11:29 問題人
          很好的文章!  回復  更多評論
            

          主站蜘蛛池模板: 长阳| 崇仁县| 广昌县| 彭山县| 饶河县| 宜章县| 长白| 惠州市| 沁阳市| 新建县| 大名县| 巧家县| 化州市| 康保县| 嘉鱼县| 汉沽区| 衡南县| 馆陶县| 曲靖市| 哈巴河县| 元朗区| 东至县| 南漳县| 城固县| 黄大仙区| 阜南县| 翁源县| 白水县| 巴马| 吴桥县| 永年县| 康保县| 吉木乃县| 屏边| 舟曲县| 巧家县| 诸城市| 阜南县| 九龙城区| 巫山县| 济南市|