SQLServer存儲過程入門案例詳解

字號:

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