報告服務(wù)器游標(biāo)的特性。
sp_describe_cursor [ @cursor_return = ] output_cursor_variable OUTPUT
{ [ , [ @cursor_source = ] N'local'
, [ @cursor_identity = ] N'local_cursor_name' ]
| [ , [ @cursor_source = ] N'global'
, [ @cursor_identity = ] N'global_cursor_name' ]
| [ , [ @cursor_source = ] N'variable'
, [ @cursor_identity = ] N'input_cursor_variable' ]
}
[@cursor_return =] output_cursor_variable OUTPUT
聲明游標(biāo)變量的名稱,該變量接收游標(biāo)輸出。output_cursor_variable 的數(shù)據(jù)類型為 cursor,沒有默認(rèn)值。調(diào)用 sp_describe_cursor 時,不能與任何游標(biāo)相關(guān)聯(lián)。返回的游標(biāo)是可滾動的動態(tài)只讀游標(biāo)。
[@cursor_source =] { N'local' | N'global' | N'variable' }
指定是使用本地游標(biāo)的名稱、全局游標(biāo)的名稱、還是游標(biāo)變量的名稱來指定當(dāng)前正在對其進(jìn)行報告的游標(biāo)。參數(shù)是 nvarchar(30)。
[@cursor_identity =] N'local_cursor_name']
由具有 LOCAL 關(guān)鍵字或默認(rèn)設(shè)置為 LOCAL 的 DECLARE CURSOR 語句創(chuàng)建的游標(biāo)的名稱。local_cursor_name 的數(shù)據(jù)類型為 nvarchar(128)。
[@cursor_identity =] N'global_cursor_name']
由具有 GLOBAL 關(guān)鍵字或默認(rèn)設(shè)置為 GLOBAL 的 DECLARE CURSOR 語句創(chuàng)建的游標(biāo)的名稱。也可以是由 ODBC 應(yīng)用程序打開然后通過調(diào)用 SQLSetCursorName 對游標(biāo)命名的 API 服務(wù)器游標(biāo)的名稱。global_cursor_name 的數(shù)據(jù)類型為 nvarchar(128)。
[@cursor_identity =] N'input_cursor_variable']
與開放游標(biāo)相關(guān)聯(lián)的游標(biāo)變量的名稱。input_cursor_variable 的數(shù)據(jù)類型為 nvarchar(128)。
無
sp_describe_cursor 將結(jié)果集封裝在 Transact-SQL cursor 輸出參數(shù)中。這樣,Transact-SQL 批處理、存儲過程和觸發(fā)器就得以按一次一行的方式處理輸出。它還意味著無法直接從數(shù)據(jù)庫 API 函數(shù)直接調(diào)用該過程。cursor 輸出參數(shù)必須綁定到程序變量,但是數(shù)據(jù)庫 API 不支持綁定 cursor 參數(shù)或變量。
下面是 sp_describe_cursor 返回的游標(biāo)格式。游標(biāo)格式與 sp_cursor_list 返回的格式相同。
列名 | 數(shù)據(jù)類型 | 描述 |
---|---|---|
reference_name | sysname | 用來引用游標(biāo)的名稱。如果通過 DECLARE CURSOR 語句中給定的名稱引用游標(biāo),則引用名稱與游標(biāo)名稱相同。如果通過變量引用游標(biāo),則引用名稱即為游標(biāo)變量的名稱。 |
cursor_name | sysname | 來自 DECLARE CURSOR 語句的游標(biāo)名稱。如果游標(biāo)是通過將游標(biāo)變量設(shè)置為游標(biāo)而創(chuàng)建的,則游標(biāo)名稱為系統(tǒng)生成的名稱。 |
cursor_scope | tinyint | 1 = LOCAL 2 = GLOBAL |
status | int | 與 CURSOR_STATUS 系統(tǒng)函數(shù)報告的值相同: 1 = 游標(biāo)名稱或變量引用的游標(biāo)打開。如果游標(biāo)為不感知游標(biāo)、靜態(tài)游標(biāo)或鍵集游標(biāo),則至少包含一行。如果游標(biāo)是動態(tài)游標(biāo),則結(jié)果集包含零行或更多的行。 |
model | tinyint | 1 = 不感知(或靜態(tài)) 2 = 鍵集 3 = 動態(tài) 4 = 快進(jìn) |
concurrency | tinyint | 1 = 只讀 2 = 滾動鎖 3 = 樂觀 |
scrollable | tinyint | 0 = 只進(jìn) 1 = 可滾動 |
open_status | tinyint | 0 = 關(guān)閉 1 = 打開 |
cursor_rows | decimal(10,0) | 結(jié)果集中合格的行數(shù)。有關(guān)更多信息,請參見 @@CURSOR_ROWS。 |
fetch_status | smallint | 此游標(biāo)上次提取的狀態(tài)。有關(guān)更多信息,請參見 @@FETCH_STATUS。 0 = 提取成功。 |
column_count | smallint | 游標(biāo)結(jié)果集中的列數(shù)。 |
row_count | decimal(10,0) | 上次對游標(biāo)的操作所影響的行數(shù)。有關(guān)更多信息,請參見 @@ROWCOUNT。 |
last_operation | tinyint | 上次對游標(biāo)執(zhí)行的操作: 0 = 沒有對游標(biāo)執(zhí)行操作。 |
cursor_handle | int | 在服務(wù)器范圍內(nèi)游標(biāo)的唯一值。 |
sp_describe_cursor 描述服務(wù)器游標(biāo)的全局特性,比如滾動和更新的能力。使用 sp_describe_cursor_columns 描述由游標(biāo)返回的結(jié)果集的特性。使用 sp_describe_cursor_tables 報告游標(biāo)所引用的基表。使用 sp_cursor_list 可獲得連接時可視的 Transact-SQL 服務(wù)器游標(biāo)的報告。
DECLARE CURSOR 語句可能會請求一個 Microsoft® SQL Server™ 使用 DECLARE CURSOR 中包含的 SELECT 語句不能支持的游標(biāo)類型。SQL Server 隱式地將游標(biāo)轉(zhuǎn)換成支持 SELECT 語句的類型。如果在 DECLARE CURSOR 語句中指定 TYPE_WARNING,SQL Server 向應(yīng)用程序發(fā)送一條轉(zhuǎn)換完畢的消息。然后就可以調(diào)用 sp_describe_cursor 確定已實現(xiàn)的游標(biāo)類型。
執(zhí)行權(quán)限默認(rèn)賦予 public 角色。
下面的示例打開一個全局游標(biāo),并使用 sp_describe_cursor 報告游標(biāo)的特性。
USE Northwind相關(guān)文章
GO
-- Declare and open a global cursor.
DECLARE abc CURSOR STATIC FOR
SELECT LastName
FROM Employees
OPEN abc
-- Declare a cursor variable to hold the cursor output variable
-- from sp_describe_cursor.
DECLARE @Report CURSOR
-- Execute sp_describe_cursor into the cursor variable.
EXEC master.dbo.sp_describe_cursor @cursor_return = @Report OUTPUT,
@cursor_source = N'global', @cursor_identity = N'abc'
-- Fetch all the rows from the sp_describe_cursor output cursor.
FETCH NEXT from @Report
WHILE (@@FETCH_STATUS <> -1)
BEGIN
FETCH NEXT from @Report
END
-- Close and deallocate the cursor from sp_describe_cursor.
CLOSE @Report
DEALLOCATE @Report
GO
-- Close and deallocate the original cursor.
CLOSE abc
DEALLOCATE abc
GO