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

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

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

    靈魂-放水

    為學(xué)日益,為道日損。

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

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

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

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

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

    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)建存儲(chǔ)過(guò)程的語(yǔ)法參數(shù)的意義如下:

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


    例如:下面創(chuàng)建一個(gè) 簡(jiǎn)單的存儲(chǔ)過(guò)程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
    通過(guò)下述sql語(yǔ)句執(zhí)行該存儲(chǔ)過(guò)程:execute productinfo
    即可檢索到產(chǎn)品信息。
    執(zhí)行存儲(chǔ)過(guò)程

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



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



    下面的例子使用了默認(rèn)參數(shù)
    USE Northwind
    GO
    CREATE PROCEDURE insert_Products_1
    ? ? ? ? ( @SupplierID_2 ? ? ? ? int,
    ? ? ? ???@CategoryID_3 ? ? ? ? int,
    ? ?? ?? ?? ?? ???@ProductName_1 nvarchar(40)='無(wú)')
    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í)行該存儲(chǔ)過(guò)程來(lái)查詢SupplierID為1的產(chǎn)品名:
    declare @product nvarchar(40)
    exec query_products 1,@product output
    select '產(chǎn)品名'= @product
    go

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


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

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


    使用系統(tǒng)存儲(chǔ)過(guò)程來(lái)查看用戶創(chuàng)建的存儲(chǔ)過(guò)程

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





    修改存儲(chǔ)過(guò)程


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

    重命名和刪除存儲(chǔ)過(guò)程

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



    刪除存儲(chǔ)過(guò)程


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



    存儲(chǔ)過(guò)程的重新編譯

    ? ?在我們使用了一次存儲(chǔ)過(guò)程后,可能會(huì)因?yàn)槟承┰颍仨毾虮碇行略黾訑?shù)據(jù)列或者為表新添加索引,從而改變了數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)。這時(shí),需要對(duì)存儲(chǔ)過(guò)程進(jìn)行重新編譯,SQL Server提供三種重新編譯存儲(chǔ)過(guò)程的方法 :
    ? ? 1、在建立存儲(chǔ)過(guò)程時(shí)設(shè)定重新編譯
    ? ?? ? 語(yǔ)法格式:CREATE??PROCEDURE? ?procedure_name? ? WITH? ?RECOMPILE? ? AS? ?sql_statement
    ? ???2、在執(zhí)行存儲(chǔ)過(guò)程時(shí)設(shè)定重編譯
    ? ?? ? 語(yǔ)法格式: EXECUTE??procedure_name??WITH??RECOMPILE
    ? ? 3、通過(guò)使用系統(tǒng)存儲(chǔ)過(guò)程設(shè)定重編譯
    ? ?? ???語(yǔ)法格式為:??EXEC??sp_recompile??OBJECT

    系統(tǒng)存儲(chǔ)過(guò)程與擴(kuò)展存儲(chǔ)過(guò)程

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


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

    最后給大家舉一個(gè)例子:

    QUOTE:
    /**
    1、? ? ? ? 在Northwind數(shù)據(jù)庫(kù)中,創(chuàng)建一個(gè)帶查詢參數(shù)的存儲(chǔ)過(guò)程,
    要求在輸入一個(gè)定購(gòu)金額總額@total時(shí),查詢超出該值的所
    有產(chǎn)品的相關(guān)信息,包括產(chǎn)品名稱和供應(yīng)商名稱、單位數(shù)量、
    單價(jià)、以及該產(chǎn)品的定購(gòu)金額總額,并通過(guò)一個(gè)輸出參數(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) 評(píng)論(4)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

    Feedback

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

    # 好看的電影 2010-05-30 14:04 好看的電影
    太牛了  回復(fù)  更多評(píng)論
      

    # re: [轉(zhuǎn)]SQL2000存儲(chǔ)過(guò)程的基礎(chǔ) 2011-04-18 11:29 問(wèn)題人
    很好的文章  回復(fù)  更多評(píng)論
      

    # re: [轉(zhuǎn)]SQL2000存儲(chǔ)過(guò)程的基礎(chǔ) 2011-04-18 11:29 問(wèn)題人
    很好的文章!  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 亚洲精品无码专区久久同性男| 久久99国产乱子伦精品免费| 黄色毛片免费在线观看| 亚洲国产精品成人AV在线| 色婷五月综激情亚洲综合| 亚洲AV综合色区无码二区偷拍 | 四虎影视在线永久免费观看| 成人免费午夜视频| 在线观看免费为成年视频| 在线免费一区二区| 日本特黄特色aa大片免费| 日韩免费视频播播| 免费人成视频x8x8入口| 亚洲精品专区在线观看| 亚洲欧洲∨国产一区二区三区| 久久亚洲精品视频| 中文字幕亚洲色图| 亚洲人成图片网站| 美女被暴羞羞免费视频| 国产日韩久久免费影院| 一区二区三区无码视频免费福利| 久久成人无码国产免费播放| 5g影院5g天天爽永久免费影院| 91在线视频免费看| 国产成人免费a在线视频app| 亚洲一区二区三区国产精品| 情人伊人久久综合亚洲| 亚洲美女免费视频| 亚洲av乱码一区二区三区按摩| 一级做a爱过程免费视| 99国产精品视频免费观看| 和日本免费不卡在线v| 日本人护士免费xxxx视频| 亚洲高清视频一视频二视频三| 亚洲va久久久噜噜噜久久男同 | 久久久久一级精品亚洲国产成人综合AV区| 亚洲色大成网站WWW久久九九| 亚洲蜜芽在线精品一区| 亚洲码欧美码一区二区三区| 乱爱性全过程免费视频| 99热在线免费观看|