Posted: 2005/1月/07 9:24上午 | IP記錄
|
|
|
給變量賦值
SQL Server 具有兩種類型的變量:全局變量和局部變量。全局變量是只讀的,你不能改變它們的值。然而你可以在多個批處理中接收全局變量的值。 局部變量則相反,僅局限於專門的某一個批處理。局部變量的優勢在於你可以修改和讀取它們的值,在本部分中,你將學習如何使用這兩 種類型的變量。
全局變量
全局變量的個數是有限的,你不能自己創建全局變量。兩個非常重要的全局變量是@@IDENTITY和@@ROWCOUNT。@@ IDENTITY變量保留最近一次插入到IDENTITY列的值,如下面的例子:
INSERT Authors(author_name) VALUES(『James Joyce』)
INSERT Books(book_id,book_title) VALUES(@@IDENTITY,』Portrait of Artist as a Yong Man』)
假定表Authors具有兩列,第一列是author_id,它是個IDENTITY列。它用於給每個Authors表中的作者 一個唯一的標誌,第二列author_name用於保留作者的姓名。假定表Books同樣也具有兩列。第一列book_id是一 個INT列,第二列book_title是一個具有VARCHAR屬性的列。
在該批處理執行時,Authors表中標誌列的值就會插入到Books表的整數列中。這就允許你進行兩個表的聯合查詢。比如,假 定你想從兩個表中得到作者的姓名和他們的書時,你就可以執行下面的SELECT語句:
SELECT author_name,book_title FROM Authors,Books
WHERE author_id=book_id
對於@@IDENTITY變量來說,一個很重要的特徵是如果有一個記錄插入了一個沒有標誌列的表之後,該變量的值就會變成NUL L。例如下面的批處理:
INSERT Authors(author_name) VALUES(『James Joyce』)
SELECT @@IDENTITY
SELECT @@IDENTITY
INSERT Books(book_id,book_title)
VALUES(@@IDENTITY,』Portrait of the Artist as a Young Man』)
SELECT @@IDENTITY
SELECT @@IDENTITY
在該批處理執行時,第一個和第二個SELECT語句返回Authors表中標誌列的值。而第三個和第四個SELECT語句則返回 空值,因為在他們之前執行了另一個INSERT 語句。
注意
當你要在Active Server Pages中接收全局變量的值時,你必須為該變量提供一個列名。比如,為了在ASP腳本中接收全局變量@@IDENTITY的值 ,使用如下的語句:
SELECT @@IDENTITY 『myidentity』
第二個重要的全局變量是@@ROWCOUNT,@@ROWCOUNT變量記錄最近一個語句執行時所影響到的列的數目。為了能夠更 清晰地瞭解該變量的工作原理,請看下面的批處理:
UPDATE Authors SET author_name=』Samel Clemens』
Where author_name=』Mark Twain』
SELECT @@ROWCOUNT
SELECT * FROM Authors Where 1=2
SELECT @@ROWCOUNT
在UPDATE語句執行之後,變量@@ROWCOUNT的值等於在數據庫中名字為』Samel Clement』的作者的數目。當最後一個SELECT語句執行後,它返回0個記錄,因此變量@@ROWCOUNT的值被置為0 (短句where 1=2保證沒有記錄會返回,因為沒有一個記錄會滿足該條件)
你不能創建自己的全局變量同時你也不能給已存在的全局變量賦值。這意味著你不能使用變量在多個批處理之間傳遞信息。
假如你需要存儲一些能被多個批處理使用的信息,你必須把信息保存在表中。你並不需要構建所用的數據庫非常之大,你只需要創建一些 只具有很少幾列的小表。在這些表中的每一列都和在傳統編程語言中的全局變量的作用非常相似。
注意
你也可以使用臨時表格來模擬傳統的全局變量。臨時表格是一個特殊的表格,它不永久地存在於數據庫中,關於更多的信息,請參看SQ L Server自帶的文檔。
局部變量
在SQL中的局部變量和在傳統編程語言中的變量非常相似。你可以定義自己的局部變量,並且給他們賦值。對於局部變量而言,最大的 局限是他只能存活在定義它的批處理中。下面是使用局部變量的一個批處理例子:
DECLARE @myvariable INT
SELECT @myvariable=2+2
SELECT @myvariable
所用的局部變量都以單個@字符開頭。在上面的例子中,局部變量@myvariable首先定義成INT類型。然後,使用SELE CT語句為該變量賦值為2+2。最後一個SELECT語句返回該變量的值。
在批處理中使用變量之前,你必須首先定義它。你在定義變量時為該變量提供了該變量的名稱和他所具有的數據類型。你可以在一個定義 語句中定義多個變量。如下所示:
DECLARE @firstname VARCHAR(20),@secondname VARCHAR(20)
SELECT @firstname=」MARK TWAIN」
SELECT @secondname=」samnel clement」
SELECT @firstname=@secondname
在該批處理中,創建了兩個變量:@firstname和@secondname。兩個變量都定義成VARCHAR數據類型。下一 步,使用SELECT語句為變量賦予不同的值。最後一個SELECT語句把第一個變量的值賦予另外一個。
你也可以把查詢結果賦予局部變量,這是一種非常有用的做法。考察下面的批處理:
DECLARE @queryresults VARCHAR(20)
SELECT @queryresults=author_name FROM Authors WHERE author_id=1
SELECT @queryresults
在該例子中,變量@queryresults賦予一個從Authors表中查詢所得到的結果。比如:如果author_id等於 1的作者名為James Joyce。則變量@queryresults的值就是James Joyce。
在Authors表中使用的標誌列用以確保最多只有一個值賦予變量。這就產生了另外兩個問題。當你賦予變量一個沒有返回值的查詢 結果時,會發生何種情況?當你賦予變量一個返回多個值的查詢結果時,又會發生什麼情況?
假如一個查詢沒有返回值,該變量保留它原先的值。當變量第一次定義時,該變量的值為NULL。因此,在前面的例子中,如果沒有一 個作者的author_id為1,則該變量將會保留值NULL。考慮下面的例子:
DECLARE @queryresults INT
SELECT @queryresults=12
SELECT @queryresults=author_id FROM Authors WHERE 1=2
SELECT @queryresults
在該例子中,查詢確保沒有返回結果因為1不等於2。因為沒有返回結果,所以變量@queryresults保留它原先的值12。
假如你把一個返回多於一個值的查詢結果賦予變量,變量將被賦予最後一個返回的值。比如:假定表Authors包含5個作者信息。 如果在標誌列中沒有間斷,在下面的批處理的最後,變量@queryresults的值將是5:
DECLARE @queryresults INT
SELECT @queryresults=author_id FROM Authors
SELECT @queryresults
當你的批處理文件編的越來越大時,你就會發現你會經常的使用局部變量。局部變量在當你需要對多個表格中的數據進行比較時非常的有 用。你可以把存儲在一個表中的數據存到一個局部變量中,然後和在另外一個表中的數據進行比較。下面就是一個簡單的例子:
DECLARE @queryresults INT
SELECT @queryresults=author_id FROM Authors
WHERE author_name=」James Joyce」
SELECT book_title FROM Books WHERE author_id=@queryresults
在該例子中,第一個SELECT語句用於接收James Joyce的author_id。這樣James Joyce的唯一標誌列就存儲在局部變量@queryresults中。然後該變量就在第二個SELECT語句中的WHERE短 句中使用。該SELECT語句通過使用變量來查詢在表Books中由James Joyce寫的書。
|