SQL @@FETCH_STATUS函数

SQL @@FETCH_STATUS函数

SQL中的 @@FETCH_STATUS 函数用于检索最近打开的游标的当前获取状态。这个函数是非确定性的,并且是应用程序中所有游标的全局函数。因为结果是不确定的。

例如,用户可能从一个游标中运行一个FETCH语句,然后使用一个存储过程来打开并处理另一个游标的输出。与在调用存储过程之前执行的FETCH语句不同,@@FETCH_STATUS在从被调用的存储过程返回控制后反映了在存储过程内执行的最后一个FETCH。

SQL @@FETCH_STATUS函数返回如下所示的整数值。

序号 返回值&描述
1 -m 表示抓取成功。
2 -1 表示抓取失败或行超出结果集。
3 -2 表示行未找到。
4 -9 表示指针未执行抓取操作。

语法

下面是 SQL @@FETCH_STATUS() 函数的语法 −

@@FETCH_STATUS

参数

它不接受任何类型的参数。

示例

通过使用以下查询,让我们创建一个名为Workers的表,在我们的示例中将进一步使用该表-

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语句向Workers表中插入一些记录:

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 );

验证

让我们通过以下查询检查表是否已成功创建:

SELECT * FROM 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 |
+----+----------+-----+-----------+---------+

示例

在下面的示例中,我们将使用while循环来控制@@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;

输出

当我们执行以上查询时,输出结果如下所示:

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

示例

让我们看下面的示例,我们将使用以下查询声明具有没有列并选择仅为NULL的光标:

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

输出

执行上述查询时,输出如下 −

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

示例

让我们看看下面的查询,我们将创建一个演示表,插入一个值,执行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

输出

执行上述查询后,输出结果如下所示 –

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

示例

让我们来看一下以下查询,我们将执行fetch_status,并使用以下查询读取游标变量中的所有行 –

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

输出

在执行上述查询后,输出如下所示 –

+-------------------+
|        isReady?   |
+-------------------+
|        1          |
+-------------------+
+-------------------+
|        Name       |
+-------------------+
|      Ramesh       |
+-------------------+
+-------------------+
|   isCursorClosed? |
+-------------------+
|        1          |
+-------------------+

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程