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