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 |
+-------------------+