考試大整理:
問題提出
我使用過幾次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
問題提出
我使用過幾次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