?? 12-2-2.cfm.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>給變量賦值</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body>
<font FACE="宋體"><b>
<p ALIGN="JUSTIFY">給變量賦值</p>
</b></font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">SQL Server
具有兩種類型的變量:全局變量和局部變量。全局變量是只讀的,你不能改變它們的值。然而你可以在多個批處理中接收全局變量的值。局部變量則相反,僅局限于專門的某一個批處理。局部變量的優勢在于你可以修改和讀取它們的值,在本部分中,你將學習如何使用這兩種類型的變量。</p>
</font><font FACE="宋體"><b>
<p ALIGN="JUSTIFY">全局變量</p>
</b></font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">全局變量的個數是有限的,你不能自己創建全局變量。兩個非常重要的全局變量是@@IDENTITY和@@ROWCOUNT。@@IDENTITY變量保留最近一次插入到IDENTITY列的值,如下面的例子:</p>
<p ALIGN="JUSTIFY">INSERT Authors(author_name) VALUES(</font><font SIZE="3">‘</font><font
FACE="宋體" SIZE="3">James Joyce</font><font SIZE="3">’</font><font FACE="宋體"
SIZE="3">)</p>
<p ALIGN="JUSTIFY">INSERT Books(book_id,book_title) VALUES(@@IDENTITY,</font><font
SIZE="3">’</font><font FACE="宋體" SIZE="3">Portrait of Artist as a Yong Man</font><font
SIZE="3">’</font><font FACE="宋體" SIZE="3">)</p>
<p ALIGN="JUSTIFY">假定表Authors具有兩列,第一列是author_id,它是個IDENTITY列。它用于給每個Authors表中的作者一個唯一的標志,第二列author_name用于保留作者的姓名。假定表Books同樣也具有兩列。第一列book_id是一個INT列,第二列book_title是一個具有VARCHAR屬性的列。</p>
<p ALIGN="JUSTIFY">在該批處理執行時,Authors表中標志列的值就會插入到Books表的整數列中。這就允許你進行兩個表的聯合查詢。比如,假定你想從兩個表中得到作者的姓名和他們的書時,你就可以執行下面的SELECT語句:</p>
<p ALIGN="JUSTIFY">SELECT author_name,book_title FROM Authors,Books</p>
<p ALIGN="JUSTIFY">WHERE author_id=book_id</p>
<p ALIGN="JUSTIFY">對于@@IDENTITY變量來說,一個很重要的特征是如果有一個記錄插入了一個沒有標志列的表之后,該變量的值就會變成NULL。例如下面的批處理:</p>
<p ALIGN="JUSTIFY">INSERT Authors(author_name) VALUES(</font><font SIZE="3">‘</font><font
FACE="宋體" SIZE="3">James Joyce</font><font SIZE="3">’</font><font FACE="宋體"
SIZE="3">)</p>
<p ALIGN="JUSTIFY">SELECT @@IDENTITY</p>
<p ALIGN="JUSTIFY">SELECT @@IDENTITY</p>
<p ALIGN="JUSTIFY">INSERT Books(book_id,book_title)</p>
<p ALIGN="JUSTIFY">VALUES(@@IDENTITY,</font><font SIZE="3">’</font><font FACE="宋體"
SIZE="3">Portrait of the Artist as a Young Man</font><font SIZE="3">’</font><font
FACE="宋體" SIZE="3">)</p>
<p ALIGN="JUSTIFY">SELECT @@IDENTITY</p>
<p ALIGN="JUSTIFY">SELECT @@IDENTITY</p>
<p ALIGN="JUSTIFY">在該批處理執行時,第一個和第二個SELECT語句返回Authors表中標志列的值。而第三個和第四個SELECT語句則返回空值,因為在他們之前執行了另一個INSERT
語句。</p>
<b>
<p ALIGN="JUSTIFY">注意</font><font SIZE="3"> </p>
</b>
<p ALIGN="JUSTIFY"></font><font FACE="宋體" SIZE="3">當你要在</font><font SIZE="3">Active
Server Pages</font><font FACE="宋體" SIZE="3">中接收全局變量的值時,你必須為該變量提供一個列名。比如,為了在</font><font
SIZE="3">ASP</font><font FACE="宋體" SIZE="3">腳本中接收全局變量</font><font
SIZE="3">@@IDENTITY</font><font FACE="宋體" SIZE="3">的值,使用如下的語句:</p>
<p ALIGN="JUSTIFY">SELECT @@IDENTITY </font><font SIZE="3">‘</font><font FACE="宋體"
SIZE="3">myidentity</font><font SIZE="3">’</p>
</font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">第二個重要的全局變量是@@ROWCOUNT,@@ROWCOUNT變量記錄最近一個語句執行時所影響到的列的數目。為了能夠更清晰地了解該變量的工作原理,請看下面的批處理:</p>
<p ALIGN="JUSTIFY">UPDATE Authors SET author_name=</font><font SIZE="3">’</font><font
FACE="宋體" SIZE="3">Samel Clemens</font><font SIZE="3">’</p>
</font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">Where author_name=</font><font SIZE="3">’</font><font FACE="宋體"
SIZE="3">Mark Twain</font><font SIZE="3">’</p>
</font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">SELECT @@ROWCOUNT</p>
<p ALIGN="JUSTIFY">SELECT * FROM Authors Where 1=2</p>
<p ALIGN="JUSTIFY">SELECT @@ROWCOUNT</p>
<p ALIGN="JUSTIFY">在UPDATE語句執行之后,變量@@ROWCOUNT的值等于在數據庫中名字為</font><font
SIZE="3">’</font><font FACE="宋體" SIZE="3">Samel Clement</font><font SIZE="3">’</font><font
FACE="宋體" SIZE="3">的作者的數目。當最后一個SELECT語句執行后,它返回0個記錄,因此變量@@ROWCOUNT的值被置為0(短句where
1=2保證沒有記錄會返回,因為沒有一個記錄會滿足該條件)</p>
<p ALIGN="JUSTIFY">你不能創建自己的全局變量同時你也不能給已存在的全局變量賦值。這意味著你不能使用變量在多個批處理之間傳遞信息。</p>
<p ALIGN="JUSTIFY">假如你需要存儲一些能被多個批處理使用的信息,你必須把信息保存在表中。你并不需要構建所用的數據庫非常之大,你只需要創建一些只具有很少幾列的小表。在這些表中的每一列都和在傳統編程語言中的全局變量的作用非常相似。</p>
<b>
<p ALIGN="JUSTIFY">注意</p>
</b>
<p ALIGN="JUSTIFY">你也可以使用臨時表格來模擬傳統的全局變量。臨時表格是一個特殊的表格,它不永久地存在于數據庫中,關于更多的信息,請參看SQL
Server自帶的文檔。</p>
</font>
<p ALIGN="JUSTIFY"><font FACE="宋體" SIZE="3"> </font></p>
<font FACE="宋體"><b>
<p ALIGN="JUSTIFY">局部變量</p>
</b></font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">在SQL中的局部變量和在傳統編程語言中的變量非常相似。你可以定義自己的局部變量,并且給他們賦值。對于局部變量而言,最大的局限是他只能存活在定義它的批處理中。下面是使用局部變量的一個批處理例子:</p>
<p ALIGN="JUSTIFY">DECLARE @myvariable INT</p>
<p ALIGN="JUSTIFY">SELECT @myvariable=2+2</p>
<p ALIGN="JUSTIFY">SELECT @myvariable</p>
<p ALIGN="JUSTIFY">所用的局部變量都以單個@字符開頭。在上面的例子中,局部變量@myvariable首先定義成INT類型。然后,使用SELECT語句為該變量賦值為2+2。最后一個SELECT語句返回該變量的值。</p>
<p ALIGN="JUSTIFY">在批處理中使用變量之前,你必須首先定義它。你在定義變量時為該變量提供了該變量的名稱和他所具有的數據類型。你可以在一個定義語句中定義多個變量。如下所示:</p>
<p ALIGN="JUSTIFY">DECLARE @firstname VARCHAR(20),@secondname VARCHAR(20)</p>
<p ALIGN="JUSTIFY">SELECT @firstname=</font><font SIZE="3">”</font><font FACE="宋體"
SIZE="3">MARK TWAIN</font><font SIZE="3">”</p>
</font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">SELECT @secondname=</font><font SIZE="3">”</font><font FACE="宋體"
SIZE="3">samnel clement</font><font SIZE="3">”</p>
</font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">SELECT @firstname=@secondname</p>
<p ALIGN="JUSTIFY">在該批處理中,創建了兩個變量:@firstname和@secondname。兩個變量都定義成VARCHAR數據類型。下一步,使用SELECT語句為變量賦予不同的值。最后一個SELECT語句把第一個變量的值賦予另外一個。</p>
<p ALIGN="JUSTIFY">你也可以把查詢結果賦予局部變量,這是一種非常有用的做法。考察下面的批處理:</p>
<p ALIGN="JUSTIFY">DECLARE @queryresults VARCHAR(20)</p>
<p ALIGN="JUSTIFY">SELECT @queryresults=author_name FROM Authors WHERE author_id=1</p>
<p ALIGN="JUSTIFY">SELECT @queryresults</p>
<p ALIGN="JUSTIFY">在該例子中,變量@queryresults賦予一個從Authors表中查詢所得到的結果。比如:如果author_id等于1的作者名為James
Joyce。則變量@queryresults的值就是James Joyce。</p>
<p ALIGN="JUSTIFY">在Authors表中使用的標志列用以確保最多只有一個值賦予變量。這就產生了另外兩個問題。當你賦予變量一個沒有返回值的查詢結果時,會發生何種情況?當你賦予變量一個返回多個值的查詢結果時,又會發生什么情況?</p>
<p ALIGN="JUSTIFY">假如一個查詢沒有返回值,該變量保留它原先的值。當變量第一次定義時,該變量的值為NULL。因此,在前面的例子中,如果沒有一個作者的author_id為1,則該變量將會保留值NULL。考慮下面的例子:</p>
<p ALIGN="JUSTIFY">DECLARE @queryresults INT</p>
<p ALIGN="JUSTIFY">SELECT @queryresults=12</p>
<p ALIGN="JUSTIFY">SELECT @queryresults=author_id FROM Authors WHERE 1=2</p>
<p ALIGN="JUSTIFY">SELECT @queryresults</p>
<p ALIGN="JUSTIFY">在該例子中,查詢確保沒有返回結果因為1不等于2。因為沒有返回結果,所以變量@queryresults保留它原先的值12。</p>
<p ALIGN="JUSTIFY">假如你把一個返回多于一個值的查詢結果賦予變量,變量將被賦予最后一個返回的值。比如:假定表Authors包含5個作者信息。如果在標志列中沒有間斷,在下面的批處理的最后,變量@queryresults的值將是5:</p>
<p ALIGN="JUSTIFY">DECLARE @queryresults INT</p>
<p ALIGN="JUSTIFY">SELECT @queryresults=author_id FROM Authors</p>
<p ALIGN="JUSTIFY">SELECT @queryresults</p>
<p ALIGN="JUSTIFY">當你的批處理文件編的越來越大時,你就會發現你會經常的使用局部變量。局部變量在當你需要對多個表格中的數據進行比較時非常的有用。你可以把存儲在一個表中的數據存到一個局部變量中,然后和在另外一個表中的數據進行比較。下面就是一個簡單的例子:</p>
<p ALIGN="JUSTIFY">DECLARE @queryresults INT</p>
<p ALIGN="JUSTIFY">SELECT @queryresults=author_id FROM Authors </p>
<p ALIGN="JUSTIFY">WHERE author_name=</font><font SIZE="3">”</font><font FACE="宋體"
SIZE="3">James Joyce</font><font SIZE="3">”</p>
</font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">SELECT book_title FROM Books WHERE </font><a
HREF="mailto:author_id=@queryresults"><font FACE="宋體" SIZE="3" COLOR="#0000ff"><u>author_id=@queryresults</u></font></a></p>
<font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">在該例子中,第一個SELECT語句用于接收James Joyce的author_id。這樣James
Joyce的唯一標志列就存儲在局部變量@queryresults中。然后該變量就在第二個SELECT語句中的WHERE短句中使用。該SELECT語句通過使用變量來查詢在表Books中由James
Joyce寫的書。</p>
</font>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -