SQL - @@FETCH_STATUS



The SQL @@FETCH_STATUS function is used to retrieve the most recent opened cursor's current fetch status. This function is non-deterministic and is a global function for all cursors in the application. Because the outcome is uncertain.

For example, a user might run a FETCH statement from one cursor, then utilise a stored procedure to open and handle the output from another cursor. Rather than the FETCH statement that was executed before the stored procedure was called, @@FETCH STATUS reflects the last FETCH that was executed inside the stored procedure after control is returned from the called stored procedure.

The SQL @@FETCH_STATUS function return the integer values as shown below −

Sr.No. Return Value & Description
1

-m

It indicates that the fetch was successful.

2

-1

It indicates that the fetch was failed or the row was beyond the result set.

3

-2

It indicates that the row fetch was missing.

4

-9

It indicates that the cursor was not performing fetch operation.

Syntax

Following is the syntax of the SQL @@FETCH_STATUS() function −

 @@FETCH_STATUS 

Parameters

It doesn't accept any kind of parameters.

Example

Let's create a table named Workers that we are going to use further in our examples by using the following query −

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

Now, let us insert some records in the Workers table using INSERT statements as shown in the query below −

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

Verification

Let's check whether the table has been created successfully or not by using the following query −

 SELECT * FROM Workers; 

Output

On executing the above query, it will generate the output as shown below −

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

Example

In the following example, we are going to use while loop to control the cursor activities of @@fetch_status by using the following the query with above created table −

 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; 

Output

When we execute the above query, the output is obtained as follows −

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

Example

Let's look into the following example, where we are going to declare the cursor with a select query whic contain no columns and select only NULL by using the following query −

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

Output

When we execute the above query, the output is obtained as follows −

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

Example

Let's look at the following query, where we are going to create a demo table, insert a value, perform the fetch_status and drop for the table, and check the result by using the following query −

 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 

Output

On executing the above query, the output is displayed as follows −

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

Example

Let's look at the following query, where we are going to perform the fetch_status and read all the rows in the cursor variable by using the following query −

 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 

Output

On executing the above query, the output is displayed as follows −

 +-------------------+ | isReady? | +-------------------+ | 1 | +-------------------+ +-------------------+ | Name | +-------------------+ | Ramesh | +-------------------+ +-------------------+ | isCursorClosed? | +-------------------+ | 1 | +-------------------+ 
sql-cursor-functions.htm
Advertisements