SQL Server 7.0 入門(七)
i. 則在其中一個路徑為遊標
在此步驟中,需要指定遊標的屬性及依需求產生的結果集。有兩種方法可以指定一個遊標。
形式1 (ANSI 92)
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE ][OF column_list]
[FOR {READ ONLY | UPDATE ][OF column_list]
[FOR {READ ONLYDE
[編號 |建立一個臨時拷貝,以後的資料從這個臨時拷貝中取得。如果在後來遊標處理的過程中,原有基表中資料發生了改變,那麼它們對於該遊標而言是不可見的。這種不敏感的遊標不允許資料更改。
SCROLL關鍵字指明遊標可以在任意方向上滾動。所有的fetch選項(first、last、next、relative、absolute)都可以在遊標中使用。如果忽略該選項,則遊標只能向前捲動(next)。
Select_statement指明SQL語句所建立的結果集。 Transact SQL語句COMPUTE、COMPUTE BY、FOR BROWSE和INTO在遊標聲明的選擇語句中不允許使用。
READ ONLY指明在遊標結果集中不允許進行資料修改。
UPDATE關鍵字指明遊標的結果集可以修改。
OF column_list指明結果集中可以進行修改的欄位。缺省情況下(使用UPDATE關鍵字),所有的欄位都可修改。
LOCAL關鍵字指明遊標是局部的,它只能在它所聲明的過程中使用。
GLOBAL關鍵字使得遊標對於整個連線全域可見。全域的遊標在連線啟動的任何時間都是可用的。只有當連線結束時,遊標才不再可用。
FORWARD_ONLY指明遊標只能向前捲動。
STATIC的遊標與INSENSITIVE的遊標是相同的。
KEYSET指明選取的行的順序。 SQL Server將從結果集中建立臨時關鍵字集。如果對資料庫的非關鍵字列進行了修改,則它們對遊標是可見的。因為是固定的關鍵字集合,所以對關鍵字列進行修改或新插入列是不可見的。
DYNAMIC指明遊標將反映所有對結果集的修改。
SCROLL_LOCK是為了確保遊標操作的成功,而對修改或刪除加鎖。
OPTIMISTIC指明哪些透過遊標進行的修改或刪除將不會成功。
注意:
· 如果在SELECT語句中使用了DISTINCT、UNION、GROUP BY語句,且在選擇中包含了聚合表達式,則遊標自動為INSENSITIVE的遊標。
· 如果基底表沒有唯一的索引,則遊標會建立成INSENSITIVE的遊標。
· 如果SELECT語句包含了ORDER BY,而被ORDER BY的列並非唯一的行標識,則DYNAMIC遊標將轉換成KEYSET遊標。如果KEYSET遊標不能打開,則將轉換成INSENSITIVE遊標。使用SQL ANSI-92語法定義的遊標也是如此,只是沒有INSENSITIVE關鍵字而已。
ii. 遊標透過DECLARE語句定義,但其實際的執行是透過OPEN語句。語法如下:
OPEN { { [GLOBAL] cursor_name } | cursor_variable_name}
GLOBAL指明一個全域遊標。
Cursor_name是被開啟的遊標的名稱。
Cursor_variable_name是所引用遊標的變數名稱。該變數應該為遊標類型。
在遊標被開啟之後,系統變數@@cursor_rows可以用來偵測結果集的行數。 @@cursor_rows為負數時,表示遊標正在被非同步遷移,其絕對值(如果@@cursor_rows為-5,則絕對值為5)為目前結果集的行數。非同步遊標使用戶在遊標被完全遷移時仍然能夠存取遊標的結果。
iii. 如果遊標定義成了可捲動的(在聲明時使用SCROLL關鍵字),則任何時候都可取出結果集中的任意行。對於非捲動的遊標,只能對目前行的下一行實作取操作。結果集可以取到局部變數中。 Fetch指令的語法如下:
FETCH [NEXT | PRIOR| FIRST | LAST | ABSOLUTE {n | @nvar} | RELATIVE {n | @nvar}]
FROM [GLOBAL] cursor_name} | cursor_variable_name}
[INTOvariable_name ][variable_variable_name}
[INTOvariable_name]。 ,……n]]
NEXT指明從目前行的下一行取值。
PRIOR指明從目前行的前一行取值。
FIRST是結果集的第一行。
LAST是結果集的最後一行。
ABSOLUTE n表示結果集中的第n行,該行數同樣可以透過一個局部變數傳播。行號從0開始,所以n為0時不能得到任何行。
RELATIVE n表示要取出的行在目前行的前n行或後n行的位置上。如果該值為正數,則要取出的行在目前行前n行的位置上,如果該值為負數,則傳回目前行的後n行。
INTO @cursor_variable_name表示遊標列值儲存的地方的變數清單。此列表中的變數數應該與DECLARE語句中選擇語句所使用的變數數相同。變數的資料類型也應該與被選擇列的資料類型相同。直到下次使用FETCH語句之前,變數中的值都會一直保持。
每一次FETCH的執行都儲存在系統變數@@fetch_status中。如果FETCH成功,則@@fetch_status被設定成0。 @@fetch_status為-1表示已經到達了結果集的一部分(例如,在遊標被開啟之後,基底表中的行被刪除)。 @@fetch_status可以用來建構遊標處理的循環。
例如:
DECLARE @iname char(20), @fname char(20)
OPEN author_cur
FETCH FIRST FROM author_cur INTO @iname, @fname
WHILE @@fetch_status = 099x; PRINT “Found Albert Ringer”
ELSE
Print “Other Ringer”
FETCH NEXT FROM author_cur INTO @iname, @fname
END
關閉遊標
CLOSE語句用來關閉遊標並釋放結果集。遊標關閉之後,不能再執行FETCH操作。如果還需要使用FETCH語句,則要重新開啟遊標。文法如下:
CLOSE [GLOBAL] cursor_name | cursor_variable_name
之後,要釋放遊標。 DEALLOCATE語句釋放資料結構和遊標所加的鎖定。文法如下:
DEALLOCATE [GLOBAL] cursor_name | cursor_variable_name
下方給出遊標的完整範例:
CREATE PROCEDURE sp_BuildIndexes
AS
DECLARE @TableName sysname, @msg varchar(100), @cmd varchar( 100)
DECLARE table_cur CURSOR FOR
SELECT name FROM sys FETCH NEXT FROM table_cur INTO @TableName
WHILE @@fetch_status = 0 etch_status = -2
CONTINUE
SELECT @msg = “Building indexes for table”+@TableName+”…”
SELECT @cmd = “DBCC DBREINDEX ('”+@TableName+”')”
EXEC (@cm
FETCH NEXT FROM FETCH NEXT FROM 下列的腳本將為PUBS資料庫執行sp_BuildIndexes
USE pubs
GO預存程序的範例。
使用臨時表
臨時表是在TempDB中所建立的表格。臨時表的名稱都以“#”開頭。臨時表的範圍為建立臨時表的連線。因為,臨時表不能在兩個連線之間共用,一旦連線關閉,臨時表就會被丟棄。如果臨時表被建立於預存程序之中,則臨時表的範圍在預存程序之中,或被該預存程序呼叫的任何預存程序之中。如果需要在連線之間共用臨時表,則需要使用全域的臨時表。全域的臨時表以「##」符號開頭,它將一直存在於資料庫中,直到SQL Server重新啟動。一旦這類臨時表建立之後,所有的使用者都可以存取。在臨時表上不能明確地指明權限。 臨時表提供了儲存中間結果的能力。有時候,臨時表還能透過將一個複雜的查詢分解成兩個查詢而獲得效能的改善。這可以透過先將第一個查詢的結果存在臨時表中,然後在第二個查詢中使用臨時表來實現。當一個大表中的某個子集在一個在座過程中使用多次時,建議使用臨時表。在這種情況下,在臨時表中保持資料的子集,以便在隨後的連接中使用,這樣能大大改善效能。也可以在臨時表中建立索引。
以上就是SQL Server 7.0 入門(七)的內容,更多相關內容請關注PHP中文網(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

HQL和SQL在Hibernate框架中進行比較:HQL(1.物件導向語法,2.資料庫無關的查詢,3.類型安全),而SQL直接操作資料庫(1.與資料庫無關的標準,2.可執行複雜查詢和資料操作)。

《OracleSQL中除法運算的用法》在OracleSQL中,除法運算是常見的數學運算之一。在資料查詢和處理過程中,除法運算可以幫助我們計算欄位之間的比例或得出特定數值的邏輯關係。本文將介紹OracleSQL中除法運算的用法,並提供具體的程式碼範例。一、OracleSQL中除法運算的兩種方式在OracleSQL中,除法運算可以用兩種不同的方式來進行

Oracle和DB2是兩個常用的關聯式資料庫管理系統,它們都有自己獨特的SQL語法和特性。本文將針對Oracle和DB2的SQL語法進行比較與區別,並提供具體的程式碼範例。資料庫連接在Oracle中,使用以下語句連接資料庫:CONNECTusername/password@database而在DB2中,連接資料庫的語句如下:CONNECTTOdataba

MyBatis動態SQL標籤解讀:Set標籤用法詳解MyBatis是一個優秀的持久層框架,它提供了豐富的動態SQL標籤,可以靈活地建構資料庫操作語句。其中,Set標籤是用來產生UPDATE語句中SET子句的標籤,在更新作業中非常常用。本文將詳細解讀MyBatis中Set標籤的用法,以及透過具體的程式碼範例來示範其功能。什麼是Set標籤Set標籤用於MyBati

SQL中的Identity是什麼,需要具體程式碼範例在SQL中,Identity是一種用於產生自增數字的特殊資料類型,它常用於唯一識別表中的每一行資料。 Identity欄位通常與主鍵列搭配使用,可確保每筆記錄都有獨一無二的識別碼。本文將詳細介紹Identity的使用方式以及一些實際的程式碼範例。 Identity的基本使用方式在建立表格時,可以使用Identit

解決方法:1、檢查登入使用者是否具有足夠的權限來存取或操作該資料庫,確保該使用者俱有正確的權限;2、檢查SQL Server服務的帳戶是否具有存取指定檔案或資料夾的權限,確保該帳戶具有足夠的權限來讀取和寫入該文件或資料夾;3、檢查指定的資料庫文件是否已被其他進程打開或鎖定,嘗試關閉或釋放該文件,並重新運行查詢;4、嘗試以管理員身份運行Management Studio等等。

如何使用SQL語句在MySQL中進行資料聚合和統計?在進行資料分析和統計時,資料聚合和統計是非常重要的步驟。 MySQL作為一個功能強大的關聯式資料庫管理系統,提供了豐富的聚合和統計函數,可以很方便地進行資料聚合和統計操作。本文將介紹使用SQL語句在MySQL中進行資料聚合和統計的方法,並提供具體的程式碼範例。一、使用COUNT函數進行計數COUNT函數是最常用

資料庫技術大比拼:Oracle和SQL的差別有哪些?在資料庫領域中,Oracle和SQLServer是兩種備受推崇的關聯式資料庫管理系統。儘管它們都屬於關係型資料庫的範疇,但兩者之間存在著許多不同之處。在本文中,我們將深入探討Oracle和SQLServer之間的區別,以及它們在實際應用中的特徵和優勢。首先,Oracle和SQLServer在語法方面存
