標題標題  顯示論壇會員列表名單  搜索論壇搜索  HelpHelp
  注冊注冊  登入登入
ASP教學區
 DoReMe : ASP教學區
主題 話題: 第十二章 高級 SQL 回復發表新主題
作者
貼子內容 << Prev Topic下一個主題 >>
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回復: 103
Posted: 2005/1月/07 9:22上午 | IP記錄 引用 bibi

在10章「基礎SQL」和11章「中級SQL」中,你已經學習了如何一次執行一個SQL語句。在本章中你將會學習如何一次執行一 組SQL語句。這樣你就可以象對傳統的編程語言一樣對SQL進行處理。在本章中,你將會學會如何創建存儲過程,觸發器和計劃任務 。

首先,你要學習SQL Server Web 助理。該程序能夠根據存儲在數據庫表內的信息自動地創建靜態網頁。

使用SQL Server Web 助理

在本書的下一部分,你將會學習到如何使用Active Server Pages創建由數據庫的信息動態生成的網頁。當你需要顯示變化迅速的數據庫信息時,你必須使用ASP腳本來接收這些信息。然而 在某些情況下,使用ASP腳本顯示數據庫信息的效率是非常低的。

比如,假設你的網站包含一個具有其他一些網站的目錄,有一個網頁顯示到你喜歡網站連接的列表,比如Yahoo!和Microso ft等。現在假定該網頁並不經常改變,最多你在大約一個星期的時間內添加一個新的連接。你可以在有訪問者訪問此頁時通過使用AS P腳本讀取存儲在數據庫表中的連接列表而動態地產生該頁。該策略能確保該網頁總是能夠顯示最新的信息。但是,考慮到該網頁的內容 並不是經常的變化,該方案並不最優。

Active Server Pages消耗計算機的資源。使用ASP腳本來打開數據庫連接和執行查詢會花費時間和增加數據庫服務器的負擔。更進一步,你的處 理器也要為執行腳本而工作。由於在該網頁上的內容並不經常改變,所以這些對服務器造成的負擔是不必要的。另外,一個更有效的方案 是僅當數據庫的內容發生改變時才生成該網頁。或者在一定的時間之後生成該網頁。該網頁並不需要在每一次有人訪問此頁時進行更新。 你真正需要的是在某一時刻自動地創建該靜態網頁。

使用SQL Server Web 助理,你可以從數據庫表中自動的生成網頁。你可以有三種方式來生成網頁:一次生成,基於計劃或當表內的內容改變時。下一部分將詳 細描述如何生成網頁。

使用SQL Server Web 助理創建網頁

本部分將一步一步的介紹如何使用SQL Server Web 助理。你將學會如何創建顯示到你所喜歡網站連接的網頁。該網頁當表內的數據發生改變時會自動進行更新。

在進行下面的工作之前,你需要創建一個包含你所喜歡網站信息的表。在ISQL/w中執行下面的SQL語句創建該表:

CREATE TABLE site_directory(site_name VARCHAR(30), site_URL VARCHAR(30), site_desc VARCHAR(100))

該網頁創建了一個名稱為site_directory的表,表中有三列:site_name,site_url和site_de sc。這三列包含了網站名稱,URL和對該網站的簡單描述。為了自動地根據該表的內容生成顯示你喜歡的連接的網頁。請按以下五個 步驟進行:

從SQL Server程序組裡啟動SQL Server Web 助理。該程序在啟動時,會要你輸入登錄信息。輸入你的SQL Server名稱,你的用戶ID,和你的密碼。(假如你在使用集成或混合模式,你可以使用信任連接登錄)。點擊Next按鈕進入 下一步。

在該步中,首先出現對話框要你指明如何為該網頁選擇數據。選中「Enter a Query as Free-Form Text」選項。這時在這些圓形按鈕下面就會出現一個空的文本窗口(見圖12.1)。選擇表site_directory所在的 數據庫。在文本窗口中輸入如下的SQL語句:

SELECT * FROM site_directory ORDERED BY site_name

該查詢語句會讀取表site_directory中所有的記錄,並把這些結果以字母順序排列。點擊「Next」進入下一步。

圖12.1 SQL Server Web Assistant-查詢對話框

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在該步中,你要對所採用的計劃進行選擇。你的選擇有:立刻創建網頁,稍後創建網頁,當數據改變時創建網頁,在星期的某一天創建網 頁和當某一常規表達式成立時創建網頁。在下拉菜單中選中「When Data Changes」。在你做完上面的工作後,就會出現一個在數據庫中所有表的列表。在列表中選擇表「site_directory 」。這樣只有當表「site_directory」的內容發生變化時才創建新的網頁。點擊」Next」進入下一步。

在本步中,首先會問及有關產生的文件的問題(見圖12.2)。使用Favorites.cfm作為你網頁的文件名。你必須在文件 名內包含網站目錄的路徑。一般的,該路徑為c:\InetPub\wwwroot\Favorites.cfm。為了定制該網頁 ,選中按鈕「The Following Information」,輸入標題「Favorite Web Sites」做為該網頁的標題。輸入標頭「web site list」做為你查詢結果的標頭。選中「No」指明你不想包含URL連接和參考文本(這是缺省選擇)。點擊「Next」進入下一 步。

圖12.2 確定文件選項

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最後一步讓你控制網頁產生的格式,你可以選擇不同的列尺寸,查詢結果的格式。最後,你還可以指明該網頁是否包含它最後一次生成的 時間,日期。列的標題,查詢結果的限制等。不要改變它們的缺省設置,點擊「Finish」完成。

HTML文件Favorites.cfm將在表site_directory內的數據發生變化時生成。初始狀態下,該文件並不存 在,因為目前該表內的數據並不發生變化。執行下面的SQL語句向表中添加數據:

INSERT site_directory (site_name ,site_URL ,site_desc ) values ( 『Microsoft』 , 』www.microsoft.com 『,』the creator of ASP』)

該語句向site_directory表中添加一條記錄。假如你現在查看Web目錄,你就會找到文件Favorites.cfm 。在Web瀏覽器內觀看該文件,其結果如圖12.3所示。

圖12.3 查詢結果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SQL Server Web 助理的工作原理

你可能想知道SQL Server Web 助理是如何工作的。你能夠選擇讓該程序基於某計劃或當表中的數據發生變化時產生該網頁,web助理是如何做到這一點的呢?

SQL Server Web 助理使用了SQL Server 的存儲過程、觸發器和計劃任務。在創建Web頁時,該程序使用了三個名稱分別為sp_makewebtask,sp_runwe btask和sp_endwebtask三個存儲過程。實際上正是這三個存儲過程創建了網頁。

注意

三個存儲過程sp_makewebtask,sp_runwebtask和sp_endwebtask可以不通過SQL Server web助理直接在ISQL/w上執行。

 

為了檢測在表中的數據發生變化。SQL Server Web 助理使用了觸發器(triggers)。觸發器就是一系列的SQL語句,它們在表內的數據進行更新,刪除和插入時執行。比如,當 你向表site_directory內插入數據時,一個能產生Favorites.cfm的觸發器就會執行。最後為了創建基於計 劃的網頁,SQL Server web助理使用了計劃任務(schedule task)。比如你能夠通過web助理按計劃每星期重新生成Favorites.cfm文件。為了完成你的任務,web助理會創 建一個計劃任務,每個星期定時執行。

本章的餘下部分將向你解釋如何創建自己的存儲過程、觸發器、和計劃任務。這些能夠讓你根據客戶的行為或時間事件對你的數據表執行 非常複雜的操作。為了能夠做到這一點,首先你必須擴充你的SQL知識。允許你像處理傳統編程語言一樣處理SQL語言。

Back to Top 查看 bibi's 資料 搜索其他貼子 bibi 訪問 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回復: 103
Posted: 2005/1月/07 9:23上午 | IP記錄 引用 bibi

使用SQL Server Web 助理創建網頁

本部分將一步一步的介紹如何使用SQL Server Web 助理。你將學會如何創建顯示到你所喜歡網站連接的網頁。該網頁當表內的數據發生改變時會自動進行更新。

在進行下面的工作之前,你需要創建一個包含你所喜歡網站信息的表。在ISQL/w中執行下面的SQL語句創建該表:

CREATE TABLE site_directory(site_name VARCHAR(30), site_URL VARCHAR(30), site_desc VARCHAR(100))

該網頁創建了一個名稱為site_directory的表,表中有三列:site_name,site_url和site_de sc。這三列包含了網站名稱,URL和對該網站的簡單描述。為了自動地根據該表的內容生成顯示你喜歡的連接的網頁。請按以下五個 步驟進行:

從SQL Server程序組裡啟動SQL Server Web 助理。該程序在啟動時,會要你輸入登錄信息。輸入你的SQL Server名稱,你的用戶ID,和你的密碼。(假如你在使用集成或混合模式,你可以使用信任連接登錄)。點擊Next按鈕進入 下一步。

在該步中,首先出現對話框要你指明如何為該網頁選擇數據。選中「Enter a Query as Free-Form Text」選項。這時在這些圓形按鈕下面就會出現一個空的文本窗口(見圖12.1)。選擇表site_directory所在的 數據庫。在文本窗口中輸入如下的SQL語句:

SELECT * FROM site_directory ORDERED BY site_name

該查詢語句會讀取表site_directory中所有的記錄,並把這些結果以字母順序排列。點擊「Next」進入下一步。

圖12.1 SQL Server Web Assistant-查詢對話框

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在該步中,你要對所採用的計劃進行選擇。你的選擇有:立刻創建網頁,稍後創建網頁,當數據改變時創建網頁,在星期的某一天創建網 頁和當某一常規表達式成立時創建網頁。在下拉菜單中選中「When Data Changes」。在你做完上面的工作後,就會出現一個在數據庫中所有表的列表。在列表中選擇表「site_directory 」。這樣只有當表「site_directory」的內容發生變化時才創建新的網頁。點擊」Next」進入下一步。

在本步中,首先會問及有關產生的文件的問題(見圖12.2)。使用Favorites.cfm作為你網頁的文件名。你必須在文件 名內包含網站目錄的路徑。一般的,該路徑為c:\InetPub\wwwroot\Favorites.cfm。為了定制該網頁 ,選中按鈕「The Following Information」,輸入標題「Favorite Web Sites」做為該網頁的標題。輸入標頭「web site list」做為你查詢結果的標頭。選中「No」指明你不想包含URL連接和參考文本(這是缺省選擇)。點擊「Next」進入下一 步。

圖12.2 確定文件選項

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最後一步讓你控制網頁產生的格式,你可以選擇不同的列尺寸,查詢結果的格式。最後,你還可以指明該網頁是否包含它最後一次生成的 時間,日期。列的標題,查詢結果的限制等。不要改變它們的缺省設置,點擊「Finish」完成。

HTML文件Favorites.cfm將在表site_directory內的數據發生變化時生成。初始狀態下,該文件並不存 在,因為目前該表內的數據並不發生變化。執行下面的SQL語句向表中添加數據:

INSERT site_directory (site_name ,site_URL ,site_desc ) values ( 『Microsoft』 , 』www.microsoft.com 『,』the creator of ASP』)

該語句向site_directory表中添加一條記錄。假如你現在查看Web目錄,你就會找到文件Favorites.cfm 。在Web瀏覽器內觀看該文件,其結果如圖12.3所示。

圖12.3 查詢結果

 

Back to Top 查看 bibi's 資料 搜索其他貼子 bibi 訪問 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回復: 103
Posted: 2005/1月/07 9:23上午 | IP記錄 引用 bibi

SQL Server Web 助理的工作原理

你可能想知道SQL Server Web 助理是如何工作的。你能夠選擇讓該程序基於某計劃或當表中的數據發生變化時產生該網頁,web助理是如何做到這一點的呢?

SQL Server Web 助理使用了SQL Server 的存儲過程、觸發器和計劃任務。在創建Web頁時,該程序使用了三個名稱分別為sp_makewebtask,sp_runwe btask和sp_endwebtask三個存儲過程。實際上正是這三個存儲過程創建了網頁。

注意

三個存儲過程sp_makewebtask,sp_runwebtask和sp_endwebtask可以不通過SQL Server web助理直接在ISQL/w上執行。

 

為了檢測在表中的數據發生變化。SQL Server Web 助理使用了觸發器(triggers)。觸發器就是一系列的SQL語句,它們在表內的數據進行更新,刪除和插入時執行。比如,當 你向表site_directory內插入數據時,一個能產生Favorites.cfm的觸發器就會執行。最後為了創建基於計 劃的網頁,SQL Server web助理使用了計劃任務(schedule task)。比如你能夠通過web助理按計劃每星期重新生成Favorites.cfm文件。為了完成你的任務,web助理會創 建一個計劃任務,每個星期定時執行。

本章的餘下部分將向你解釋如何創建自己的存儲過程、觸發器、和計劃任務。這些能夠讓你根據客戶的行為或時間事件對你的數據表執行 非常複雜的操作。為了能夠做到這一點,首先你必須擴充你的SQL知識。允許你像處理傳統編程語言一樣處理SQL語言。

Back to Top 查看 bibi's 資料 搜索其他貼子 bibi 訪問 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回復: 103
Posted: 2005/1月/07 9:24上午 | IP記錄 引用 bibi

Transact-SQL編程

在下面部分的許多語句都不是SQL標準語句,而是一個叫做Transact-SQL(T-SQL)的SQL擴展的一部分。T- SQL通過在別的事物上添加一些諸如變量、條件和循環之類的傳統編程元素來擴充SQL。

你可能注意到這個問題的唯一原因是你計劃使用一種和Microsoft SQL Server不同的數據庫服務器。在下面部分介紹的語句和技術並不是所有都是可替換的。然而,如果你想全面的利用Microso ft SQL Server的性能,你必須使用T-SQL。

在批處理中執行多個語句

為了一次能夠執行多個SQL語句,你可以把它們一起放入一個批處理中。批處理,如同它的名字所隱含的意識一樣,是簡單的一個或多 個SQL語句組成的語句組。比如,假如你在ISQL/w中輸入下面的兩個語句,它們就會做為一個批處理而一起執行:

SELECT pub_name FROM publishers

SELECT pub_name FROM publishers

當你執行上面那個簡單的批處理時,在表中同樣的數據被讀取了兩次---一個SELECT 語句讀取一次。現在假設你輸錯了第二個SELECT語句中表的名稱,並嘗試執行下面的語句:

SELECT pub_name FROM publishers

SELECT ub_name FROM publishers

你可能期望第一個語句能夠成功執行,而在執行第二個語句時會發生錯誤。而實際上並不是這樣,在大多數情況下,如果在批處理中有任 何一個語句不能成功執行。在其中沒有一個語句會執行(特殊情況請看下面的注意)。SQL Server 把在批處理中的語句當成組來看待。

注意

在一些情況下,一個語句在發生錯誤時,其他語句仍然能夠執行。假如服務器在傳遞和編譯一個批處理時檢測到錯誤,則在批處理中的所 有語句都不能執行。假如批處理通過了編譯但仍然存在錯誤,則在其中的某些語句就可能會執行。

你可以把一組語句分成隔離的批處理。在ISQL/w中,你可以使用命令GO來實現該功能。考察下面的語句:

SELECT pub_name FROM publishers

GO

SELECT ub_name FROM publishers

假如你在ISQL/w中執行上面的語句。即使在第二個SELECT語句中存在錯誤。第一個語句仍然能夠成功地返回答案集。GO命 令強迫SQL Server 將此二個語句看成兩個批處理。

Back to Top 查看 bibi's 資料 搜索其他貼子 bibi 訪問 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回復: 103
Posted: 2005/1月/07 9:24上午 | IP記錄 引用 bibi

給變量賦值

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寫的書。

Back to Top 查看 bibi's 資料 搜索其他貼子 bibi 訪問 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回復: 103
Posted: 2005/1月/07 9:24上午 | IP記錄 引用 bibi

在屏幕上顯示數據

一般的,當你在執行批處理時並不需要在屏幕上打印任何結果。然而在你調試一組SQL語句時,PRINT語句就能派上用場。下面就 是PRINT語句的一個簡單例子:

DECLARE @myvariable VARCHAR(30)

SELECT @myvariable=」Hello There!」

PRINT @myvariable

你不能使用PRINT語句在屏幕上打印除字符類型以外的其它數據類型。假如你需要打印其它的數據類型,你首先必須使用CONVE RT()函數來轉化他們。比如:

DECLARE @myvariable VARCHAR(10),@mynumber INT

SELECT @mynumber=12

SELECT @myvariable=CONVERT(VARCHAR(10),@mynumber)

PRINT @myvariable

在上面的例子中,變量@mynumber首先賦值12。但是你不能直接打印該變量,因為該變量的值並不是字符類型。CONVER T()函數用於把該值轉化成VARCHAR數據類型,這樣它就能夠打印了。

技巧

假如你僅僅是因為調試的原因而觀看變量的值,你可以使用SELECT語句而不是PRINT語句。使用SELECT語句,你並不需 要把一個變量轉換成字符類型。

Back to Top 查看 bibi's 資料 搜索其他貼子 bibi 訪問 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回復: 103
Posted: 2005/1月/07 9:25上午 | IP記錄 引用 bibi

註釋你的SQL語句

當你的SQL語句集合變得越來越大而非常複雜時,你需要對你的語句進行註釋。你可以使用兩種方法在你的語句中添加註釋。假如你需 要添加單行的註釋時,你可以在一行後使用兩個連字符,如下所示:

DECLARE @myvariable DATETIME

SELECT @myvariable=GETDATE() –Gets The Current Date

SELECT @DATENAME(dw,@myvariable)—Gets The Day of the Week

當你使用雙連字符時,在雙聯字符後面到本行的結尾之間部分全是註釋。為了創建一個多行的註釋,你需要把註釋包含在字符/*和*/ 之間,如下所示:

DECLARE @myvariable DATETIME

/* The following statements retrieve the current date and time and extract the day of the week from the results.

*/

SELECT @myvariable=GETDATE()

SELECT DATENAME(dw,@myvariable)

註釋對文檔的代碼而言沒有任何用處;他們只在調試程序時有用。假如你想臨時讓一部分的SQL語句失去效用,你可以簡單的使用註釋 符號包含它們。當你準備再次包含這些語句時,你只需要刪除註釋符號。

用條件控制語句的執行

當你想根據某些條件來執行一個或多個SQL語句時,你需要使用conditional,請看下面的例子:

IF (SELECT COUNT(*)FROM Authors) >10 PRINT 「More than 10 Authors!」

假如在表Authors中有多於10個的作者,該語句就會打印More than 10 Authors!結果。

注意

仔細觀看該條件語句的結構。注意到缺了什麼?這裡沒有THEN語句。假如你在條件語句中包含了THEN,就會產生錯誤。

你可以創建一個可以執行一塊語句的條件判定。只需要把你要執行的這塊語句包含在關鍵字BEGIN和END中:

IF DATENAME(mm,GETDATE())=」July」

BEGIN

PRINT 「It is July」

PRINT 「Happy July」

END

假如你在執行該批處理時剛好是7月份。則包含在BEGIN和END中的語句將會執行。

同樣的,你還可以嵌套IF語句,如下面的例子所示:

IF DATENAME(mm,GETDATE())=」July」

BEGIN

PRINT 「It is July」

PRINT 「Happy July」

IF DATEPART(dd,GETDATE())=4

BEGIN

PRINT 「And it is the 4th」

PRINT 「Happy 4th of July」

END

END

假如在你執行該語句時恰好是7月4號,則在內層的語句塊也將會執行。下面就是你執行的結果(如果你是在7月4號執行該批處理的話 )

It is July

Happy July

And it is the 4th

Happy 4th of July

使用關鍵字ELSE和IF語句一起使用,可以創建邏輯上與判斷語句相反的代碼。下面的例子在星期五執行時打印It is Friday!,而在其他時間執行時打印Some other day。

If DATENAME(dw,GETDATE())=」Friday」

PRINT 「It is Friday」

ELSE

PRINT 「Some other day」

最後你可以在條件語句中使用關鍵字EXISTS來判斷查詢是否返回結果。下面的例子就使用EXISTS語句來判斷作者James Joyce是否在表Authors中:

IF EXISTS(SELECT author_name FROM authors WHERE author_name=」James Joyce」)

PRINT 「James Joyce is an author」

ELSE

PRINT 「James Joyce is not an author」

Back to Top 查看 bibi's 資料 搜索其他貼子 bibi 訪問 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回復: 103
Posted: 2005/1月/07 9:25上午 | IP記錄 引用 bibi

使用CASE控制語句執行

假設你想在網頁上顯示你喜歡站點的名稱,URL,和關於它的簡單描述。更進一步,你想在列出這些站點時在站點的名稱旁邊指明每一 個網站的類型。比如,在政府機關網站的旁邊,你會顯示單詞Government;在商業網站的旁邊,顯示單詞Commercia l。為了做到這一點,你可能會創建一個具有4列的表。前三列和原先的一樣,分別是名稱列,URL列,簡單描述列。另外你可能會添 加一個新列,該列為每一個網站的類型。

但在實際上,你不需要這樣做…有一種能獲得同樣的結果但是更好的方法。

按照上面的做法,你的數據表中就會包含多餘的信息。因為在URL列中已經包含了每一個網站類型的信息。通過查看每一個URL最後 的三個字母,你就能確定某個網站是商業的,政府的和教育的等等。所以你不需要在數據表中添加新列重複同樣的信息。但是當你在讀取 數據表中的記錄時你是如何在URL列中獲取該信息的呢?你可以使用CASE表達式來做到這一點。如下面的例子所示:

SELECT

CASE

WHEN site_url LIKE 「%edu」 THEN 「Educational」

WHEN site_url LIKE 「%gov」 THEN 「Government」

WHEN site_url LIKE 「%com」 THEN 「Commercial」

ELSE 「Other」

END

) 「TYPE」,

site_name 「Name」,

site_URL 「URL」,

site_desc 「Description」

FROM site_directory

 

注意

字母.edu,.gov,和.com都是頂級域名的例子,目前還有許多的頂級域名在使用,比如,假如某個網站的域名以字母.cn 結尾,這就指明該網站建在中國大陸。

當上面的SELECT語句執行時,你就會接收到正確的結果。為了返回正確的值,我們使用CASE表達式對site_url列進行 了檢測。比如,當site_url列的值以三個字母edu結尾時,就會返回值Educational。下面就是從該查詢返回結果 的一個例子:

Type
 Name
 URL
 Description
 
……………..
 ………………
 厖厖厖
 厖厖厖
 
Commercial
 Microsoft
 www.microsoft.com
 The Creators of Active Server Pages
 
Commercial
 Yahoo
 www.yahoo.com
 One of the best Internet Directories
 
Commercial
 Collegescape
 www.collegescape.com
 Apply to over 50 colleges online
 
Educational
 MIT
 www.mit.edu
 The Massachusetts Institute of Technology
 
Government
 The whitehouse
 www.whitehouse.gov
 The residence of the Prisedent
 

使用CASE語句,你可以測試不同的條件,並且基於不同的結果返回不同的值。對於每一個測試,都有對應的WHEN短句。在該例子 中,當在WHEN短句後面的語句為真時,返回在相應的THEN短句後面的值。如果沒有一個WHEN短句後面的語句為真,則返回在 ELSE短句後面的值。

所有的多個WHEN短句和可以選擇的單個ELSE短句都必須包含在表達式CASE和END之間。關鍵字CASE指明CASE語句 的開始。而關鍵字END指明CASE語句的結束。

CASE語句具有另外一種稍微不同的格式。考察在下面的例子內是如何使用CASE語句的:

SELECT

(CASE

site_name

WHEN 「Yahoo」 THEN 「Internet Directory」

WHEN 「Microsoft」 THEN 「Software Giant」

ELSE 「Other」

END

)」Type」,

site_name 「Name」,

site_URL 「URL」,

site_desc 「Description」

FROM site_directory

該例子同樣顯示網站列表的類型,名稱,URL和簡要描述。所不同的是,在該例子中,每個網站的類型是由網站的名稱決定的,而不是 URL。下面就是該批處理的結果:

Type
 Name
 URL
 Description
 
Software Giant
 Microsoft
 www.microsift.com
 The Creators of Active Server Pages
 
Internet Directory
 Yahoo
 www.yahoo.com
 One of the best Internet Directories
 
Other
 Collegescape
 www.collegescape.com
 Apply to over 50 college online
 
Other
 MIT
 www.mit.edu
 The Massachusetts Institute of Technology
 
Other
 The whitehouse
 www.whitehouse.gov
 The residence of the President
 

(5 row(s) affected)

請注意在該例子中,CASE例子是如何書寫的。在該CASE語句中,在WHEN短語後面並沒有跟一個語句,而是要與site_n ame列的值相比較的值。

當你具有多個條件且每一個條件都是可真或可假時,你必須使用第一種CASE語句格式。假如你需要把一個值和多個值比較時,則使用 第二種格式。

Back to Top 查看 bibi's 資料 搜索其他貼子 bibi 訪問 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回復: 103
Posted: 2005/1月/07 9:25上午 | IP記錄 引用 bibi

使用RETURN語句從批處理中返回

為了從批處理中退出,你可以使用RETURN語句。考察下面的例子:

IF DATENAME(dw,GETDATE())=」Saturday」

BEGIN

PRINT 「It is Saturday」

RETURN

END

PRINT 「It is some other day」

當該批處理在星期天執行時,在條件語句後面的語句塊就會執行。當碰到RETURN語句時,該批處理立即就退出了。這也意味著下面 的語句僅僅在不是星期天的某一天顯示:

It is some other day

Back to Top 查看 bibi's 資料 搜索其他貼子 bibi 訪問 bibi's
 
bibi
Senior Member
Senior Member


加入: 2005/1月/07
Online Status: Offline
回復: 103
Posted: 2005/1月/07 9:25上午 | IP記錄 引用 bibi

把語句組入到事務中

假如你想在你的網站上出售商業卡。首先,為了做到這一點,你必須創建兩個表格,一個表格包含了要付帳的信用卡帳號的列表。另外一 個表則包含了定購產品的定單的列表。無論何時,當一個客戶在訪問你的站點時定購了商業卡,你需要把信息同時添入到兩個表格中。

現在假設有一個訪問你站點的客戶定購了商業卡。首先該客戶的信用卡號添加到信用卡表中。然而就在這一時刻。你Web服務器的硬盤 驅動器突然壞了。該客戶的定單並沒有保留到產品定單表中。這就會使事情變得很糟糕。來訪者的信用卡為商業卡付了賬,但是確沒有收 到定購的產品。此時定購的客戶肯定會對你的行為感到生氣。你該怎樣阻止該事情的發生呢?

在本節中,將會用到下面的三個語句:BEGIN TRANSACTION,COMMIT TRANSACTION和ROLLBACK TRANSACTION。一個事務(transaction)是一組語句,這組語句要麼全部執行,要麼全部不執行。下面就是如何 使用這些語句的一個簡單的例子:

BEGIN TRANSACTION

INSERT credit_cards (username,ccnumber)

VALUES(『Andrew Jones』,』5555-55-555-55-5555』)

INSERT orders(username) VALUES (『Andrew Jones』)

COMMIT TRANSACTION

在該例子中,我們使用BEGIN TRANSACTION 和COMMIT TRANSACTION來定義事務塊.在該塊中顯示的語句只有在執行COMMIT TRANSACTION後才發生效用。假如在到達該語句之前的任一點發生了錯誤,所有在該事務中的語句都不會發生效用。比如在上 面的例子中,如果你的硬盤在執行完第一個INSERT語句而在第二個語句之前發生了硬盤錯誤。沒有數據會插入到任一表中。第一個 語句會倒轉回去,並不會有如何效果。

你可以使用ROLLBACK TRANSACTION語句來顯式地倒轉一個事務,如下所示:

BEGIN TRANSACTION

INSERT credit_cards(username,ccnumber)

VALUES(『Andrew Jones』,』5555-55-555-55-5555』)

INSERT orders(username) VALUES(『Andrew Jones)

IF DATENAME(dw,GETDATE())=」Tuesday」

ROLLBACK TRANSACTION

ELSE

COMMIT TRANSACTION

在上面的例子中,事務在除了星期二外的每天都遞發。假如一個星期中的某一天剛好是星期二,則事務就會倒轉回去,不會產生任何效果 。換句話說,在在星期二不會收到任何新的定單。

注意

在和觸發器一起使用時,ROLLBACK TRANSACTION命令特別有用。參看下面的「結合觸發器和事務過程」部分。

Back to Top 查看 bibi's 資料 搜索其他貼子 bibi 訪問 bibi's
 

of 2 下一頁 >>
  回復發表新主題
顯示可打印的頁面 顯示可打印的頁面

論壇跳轉
不能 張貼新論題在這個討論版
不能 回應論題在這個討論版
不能 刪除你的發言在這個討論版
不能 編輯你的發言在這個討論版
不能 新增投票標題在這個討論版
不能 在這個討論版投票

Edit by doreme Forums version 2004
Welcome ©2001-2004 doreme Guide

This page was generated in 0.2813 seconds.

 
保養品
保養品, Skin Care
www.elady.tw
Makeups Wholesale
Wholesale Cosmetics SkinCares
lungjyi.com
保養品批發
名牌保養品、保養品批發
www.perfume.com.tw/skincare
Wholesale Perfumes
Fragrances Perfumes Wholesale
lungjyi.net