<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    靈魂-放水

    為學日益,為道日損。

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

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

    ? ??? ?在SQL Server中,可以使用三種方法創(chuàng)建存儲過程 :
    ? ?? ?? ?①使用創(chuàng)建存儲過程向?qū)?chuàng)建存儲過程。
    ? ?? ?? ?②利用SQL Server 企業(yè)管理器創(chuàng)建存儲過程。
    ? ?? ?? ?③使用Transact-SQL語句中的CREATE PROCEDURE命令創(chuàng)建存儲過程。

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

    使用CREATE PROCEDURE創(chuàng)建存儲過程的語法形式如下:

    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創(chuàng)建存儲過程的語法參數(shù)的意義如下:

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


    例如:下面創(chuàng)建一個 簡單的存儲過程productinfo,用于檢索產(chǎn)品信息。
    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語句執(zhí)行該存儲過程:execute productinfo
    即可檢索到產(chǎn)品信息。
    執(zhí)行存儲過程

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



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



    下面的例子使用了默認參數(shù)
    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


    下面的例子使用了返回參數(shù)
    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

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

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


    使用企業(yè)管理器查看用戶創(chuàng)建的存儲過程

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


    使用系統(tǒng)存儲過程來查看用戶創(chuàng)建的存儲過程

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





    修改存儲過程


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

    重命名和刪除存儲過程

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



    刪除存儲過程


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



    存儲過程的重新編譯

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

    系統(tǒng)存儲過程與擴展存儲過程

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


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

    最后給大家舉一個例子:

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


    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 放水老倌 閱讀(10724) 評論(4)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

    Feedback

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

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

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

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

    主站蜘蛛池模板: 亚洲黄色片免费看| 国产精品亚洲片在线va| 国产精品免费一级在线观看| 国产白丝无码免费视频| 一级做a爰片久久毛片免费陪| 国产99在线|亚洲| 亚洲av女电影网| 国产亚洲老熟女视频| 在线观看免费国产视频| 69式国产真人免费视频| 99在线在线视频免费视频观看| 国产高潮流白浆喷水免费A片 | 亚洲成a人无码亚洲成av无码 | 亚洲日韩精品无码专区加勒比☆| 亚洲AV日韩AV天堂一区二区三区 | 国产精品久久亚洲一区二区| 91在线亚洲综合在线| 亚洲国产综合人成综合网站00| 亚洲AV日韩AV天堂久久| 亚洲精品乱码久久久久久自慰| 亚洲精品A在线观看| 国产成人免费永久播放视频平台 | 亚洲午夜福利在线视频| 亚洲日本国产综合高清| 亚洲国产超清无码专区| 亚洲福利视频一区二区三区| 亚洲天堂久久精品| 亚洲国产综合专区在线电影| 亚洲av丰满熟妇在线播放| 亚洲AV一宅男色影视| 亚洲激情在线视频| 亚洲精品国产成人99久久| 亚洲电影一区二区三区| 亚洲国产精久久久久久久| 久久精品亚洲综合专区| 亚洲国产女人aaa毛片在线 | 在线视频精品免费| 两性刺激生活片免费视频| 毛片免费观看的视频| 永久免费AV无码网站在线观看| 国产美女精品视频免费观看 |