SQL - @@FETCH_STATUS



SQL 的@@FETCH_STATUS 函式用於檢索最近開啟的遊標的當前提取狀態。此函式是非確定性的,並且是應用程式中所有遊標的全域性函式。因為結果是不確定的。

例如,使用者可能會從一個遊標執行 FETCH 語句,然後利用儲存過程來開啟和處理來自另一個遊標的輸出。而不是在呼叫儲存過程之前執行的 FETCH 語句,@@FETCH STATUS 反映了在從呼叫的儲存過程返回控制後在儲存過程中執行的最後一個 FETCH。

SQL @@FETCH_STATUS 函式返回如下所示的整數值 -

序號 返回值和描述
1

0

表示提取成功。

2

-1

-1

3

-2

表示提取失敗或行超出結果集。

4

-9

-2

表示行提取丟失。

-3

@@FETCH_STATUS

表示遊標未執行提取操作。

語法

以下是 SQL @@FETCH_STATUS() 函式的語法 -

引數

CREATE TABLE Workers(
   ID   INT              NOT NULL,
   NAME VARCHAR (20)     NOT NULL,
   AGE  INT              NOT NULL,
   ADDRESS  CHAR (25) ,
   SALARY   DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

它不接受任何型別的引數。

INSERT INTO Workers VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO Workers VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO Workers VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO Workers VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO Workers VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO Workers VALUES (6, 'Komal', 22, 'MP', 4500.00 );

示例

讓我們建立一個名為 Workers 的表,我們將在後續的示例中使用它,使用以下查詢 -

SELECT * FROM Workers;

現在,讓我們使用 INSERT 語句在 Workers 表中插入一些記錄,如下面的查詢所示 -

驗證

+----+----------+-----+-----------+---------+
| ID | NAME     | AGE | ADDRESS   | SALARY  |
+----+----------+-----+-----------+---------+
|  1 | Ramesh   |  32 | Ahmedabad | 2000.00 |
|  2 | Khilan   |  25 | Delhi     | 1500.00 |
|  3 | kaushik  |  23 | Kota      | 2000.00 |
|  4 | Chaitali |  25 | Mumbai    | 6500.00 |
|  5 | Hardik   |  27 | Bhopal    | 8500.00 |
|  6 | Komal    |  22 | MP        | 4500.00 |
+----+----------+-----+-----------+---------+

以下是 SQL @@FETCH_STATUS() 函式的語法 -

讓我們使用以下查詢檢查表是否已成功建立 -

DECLARE Work CURSOR FOR  
SELECT Name,Age 
FROM Workers;  
OPEN Work;  
FETCH NEXT FROM Work;  
WHILE @@FETCH_STATUS =0  
   BEGIN  
      FETCH NEXT FROM Work
   END;

現在,讓我們使用 INSERT 語句在 Workers 表中插入一些記錄,如下面的查詢所示 -

輸出

+--------+------+
| Name   | Age  |
+--------+------+
| Khilan | 25   |
+--------+------+
+--------+------+
| Name   | Age  |
+--------+------+
|Kaushik | 23   |
+--------+------+
+--------+------+
| Name   | Age  |
+--------+------+
|Chaitali| 25   |
+--------+------+
+--------+------+
| Name   | Age  |
+--------+------+
| Hardik | 27   |
+--------+------+
+--------+------+
| Name   | Age  |
+--------+------+
| Komal  | 22   |
+--------+------+
+--------+------+
| Name   | Age  |
+--------+------+
|        |      |
+--------+------+

以下是 SQL @@FETCH_STATUS() 函式的語法 -

執行上述查詢後,它將生成如下所示的輸出 -

DECLARE Work CURSOR FOR 
SELECT null FROM INFORMATION_SCHEMA.TABLES
OPEN Work 
SELECT fetch_status from sys.dm_exec_cursors(@@SPID) WHERE name = 'Work'

現在,讓我們使用 INSERT 語句在 Workers 表中插入一些記錄,如下面的查詢所示 -

輸出

+------------------------------------+
|                        fetch_status|
+------------------------------------+
|                                -9  |
+------------------------------------+

以下是 SQL @@FETCH_STATUS() 函式的語法 -

在以下示例中,我們將使用 while 迴圈來控制使用以下查詢與上面建立的表一起使用的 @@fetch_status 的遊標活動 -

DECLARE @Id int
CREATE TABLE Welcome (
   Id int not null PRIMARY KEY
)
INSERT INTO Welcome (Id) VALUES (1),(2) 
DECLARE Work CURSOR KEYSET FOR SELECT Id FROM Welcome ORDER BY Id
OPEN Work
FETCH NEXT FROM Work INTO @Id
DELETE FROM Welcome WHERE Id = 2 
FETCH NEXT FROM Work INTO @Id  
SELECT @@FETCH_STATUS as [Fetch_Status]
DROP TABLE Welcome
CLOSE Work
DEALLOCATE Work

現在,讓我們使用 INSERT 語句在 Workers 表中插入一些記錄,如下面的查詢所示 -

當我們執行上述查詢時,輸出如下所示 -

+------------------------------------+
|                        Fetch_Status|
+------------------------------------+
|                                 -2 |
+------------------------------------+

以下是 SQL @@FETCH_STATUS() 函式的語法 -

讓我們看看以下示例,我們將使用以下查詢宣告一個包含無列且僅選擇 NULL 的 select 查詢的遊標 -

DECLARE Work CURSOR  FOR 
   SELECT Top 2 Name FROM Workers
OPEN Work
SELECT CURSOR_STATUS('global','Work') AS 'isReady?'
fetch next from Work;
while @@FETCH_STATUS = 1
begin
   fetch next from Work;
end
CLOSE Work
SELECT abs(CURSOR_STATUS('global','Work')) AS 'isCursorClosed?'
DEALLOCATE Work

現在,讓我們使用 INSERT 語句在 Workers 表中插入一些記錄,如下面的查詢所示 -

當我們執行上述查詢時,輸出如下所示 -

+-------------------+      
|          isReady? |
+-------------------+
|               1   |
+-------------------+
+-------------------+
|              Name |
+-------------------+
|          Ramesh   |
+-------------------+
+-------------------+      
|   isCursorClosed? |
+-------------------+
|               1   |
+-------------------+
讓我們看看以下查詢,我們將建立一個演示表,插入一個值,執行 fetch_status 和 drop 操作,並使用以下查詢檢查結果 -
讓我們看看以下查詢,我們將使用以下查詢執行 fetch_status 並讀取遊標變數中的所有行 -
sql-cursor-functions.htm
© . All rights reserved.