SQLServer存儲(chǔ)過程入門案例詳解

字號(hào):

考試大整理:
    問題提出
    我使用過幾次SQL Server,但所有與數(shù)據(jù)庫(kù)的交互都是通過應(yīng)用程序的編碼來實(shí)現(xiàn)的。我不知到在哪里使用存儲(chǔ)過程,也不了解實(shí)現(xiàn)存儲(chǔ)過程需要做哪些工作。希望能詳細(xì)說明。
    專家答疑
    存儲(chǔ)過程是存儲(chǔ)于數(shù)據(jù)庫(kù)中的一組T-SQL語(yǔ)句。有了存儲(chǔ)過程之后,與數(shù)據(jù)庫(kù)的交互就沒有必要在程序中寫一堆的SQL語(yǔ)句,而只需用一條語(yǔ)句調(diào)用適當(dāng)?shù)拇鎯?chǔ)過程來完成就可以了。另外,由于代碼是存儲(chǔ)在數(shù)據(jù)庫(kù)中,我們也可以在不同的應(yīng)用程序或查詢窗口中不斷的重復(fù)利用那些代碼。下面將講述一些簡(jiǎn)單的例子,它們將說明如何構(gòu)造和使用存儲(chǔ)過程。
    下面的例子將簡(jiǎn)單的說明如何創(chuàng)建存儲(chǔ)過程。以下所有例子均使用AdventureWorks數(shù)據(jù)庫(kù)。其它的數(shù)據(jù)庫(kù)和應(yīng)用程序可以依此類推。
    例 1 – 簡(jiǎn)單的存儲(chǔ)過程
    這個(gè)簡(jiǎn)單的存儲(chǔ)過程將實(shí)現(xiàn)如下功能:從Person.Contact表中取出第一條記錄。
    CREATE PROCEDURE uspGetContact
    AS
    SELECT 1 ContactID, FirstName, LastName
    FROM Person.Contact
    創(chuàng)建完上面的語(yǔ)句后,使用下面的命令可以執(zhí)行該存儲(chǔ)過程。
    EXEC uspGetContact
    查詢的結(jié)果如下:
    例 2 – 帶參數(shù)的存儲(chǔ)過程
    這個(gè)例子在上個(gè)例子的基礎(chǔ)上做了一點(diǎn)修改:傳入了一個(gè)參數(shù),根據(jù)傳入的參數(shù)來查詢相應(yīng)的記錄。為了更好地利用上面的例子,這次我們就不用重新再創(chuàng)建一個(gè)存儲(chǔ)過程了,而是使用ALTER PROCEDURE(注意:不是CREATE PROCEDURE)來修改例1中已經(jīng)創(chuàng)建好的存儲(chǔ)過程。代碼如下:
    ALTER PROCEDURE uspGetContact @LastName NVARCHAR(50)
    AS
    SELECT 1 ContactID, FirstName, LastName
    FROM Person.Contact
    WHERE LastName = @LastName
    下面顯示了運(yùn)行存儲(chǔ)過程的2種不同方法。第一種方法僅僅傳入了我們想要的參數(shù)值。而第二種方法包含了參數(shù)名和參數(shù)值。任意一種方法都可以運(yùn)行該例中的存儲(chǔ)過程。
    EXEC uspGetContact 'Alberts'
    EXEC uspGetContact @LastName='Alberts'
    查詢結(jié)果如下:
    例 3 – 帶輸入和輸出參數(shù)的存儲(chǔ)過程
    這個(gè)例子中既有輸入?yún)?shù)也有輸出參數(shù)。在存儲(chǔ)過程中查詢后得到的ContactID可以利用輸出參數(shù)進(jìn)行回傳?;貍鲄?shù)用戶查詢?nèi)藛T表中的其他字段,如ContactID、FirstName、LastName以及這個(gè)人的任何地址記錄。
    首先,我們按如下方式修改存儲(chǔ)過程uspGetContact。其次,運(yùn)行下面代碼執(zhí)行該存儲(chǔ)過程。最后,基于傳回的值可以查詢?nèi)藛T的姓名和地址等信息。
    ALTER PROCEDURE uspGetContact @LastName NVARCHAR(50), @ContactID INT output
    AS
    SELECT 1 @ContactID = c.ContactID
    FROM HumanResources.Employee a
    INNER JOIN HumanResources.EmployeeAddress b ON a.EmployeeID = b.EmployeeID
    INNER JOIN Person.Contact c ON a.ContactID = c.ContactID
    INNER JOIN Person.Address d ON b.AddressID = d.AddressID
    WHERE c.LastName = @LastName
    存儲(chǔ)過程修改后,運(yùn)行如下代碼將執(zhí)行該存儲(chǔ)過程。如果ContactID有值,就會(huì)返回人員和地址信息。
    DECLARE @ContactID INT
    SET @ContactID = 0
    EXEC uspGetContact @LastName='Smith', @ContactID=@ContactID OUTPUT
    IF @ContactID <> 0
    BEGIN
    SELECT ContactID, FirstName, LastName
    FROM Person.Contact
    WHERE ContactID = @ContactID
    SELECT d.AddressLine1, d.City, d.PostalCode
    FROM HumanResources.Employee a
    INNER JOIN HumanResources.EmployeeAddress b ON a.EmployeeID = b.EmployeeID
    INNER JOIN Person.Contact c ON a.ContactID = c.ContactID
    INNER JOIN Person.Address d ON b.AddressID = d.AddressID
    WHERE c.ContactID = @ContactID
    END