SA0258 : The number of FETCH statement variables does not match the number of columns in the cursor definition |
![]() |
Ensuring the number of columns in a cursor’s SELECT list matches the number of variables in the FETCHINTO clause is essential to prevent runtime errors and unexpected behavior.

A common issue in T-SQL scripts involves mismatches between the number of columns in a cursor’s SELECT list and the number of variables in the INTO clause of a FETCH statement. This mismatch can cause runtime errors or unintended behavior in SQL Server.
For example:
1-- Example of problematic FETCH statement 2DECLARE cur CURSOR FOR 3SELECT FirstName, LastName FROM Employees; 4 5OPEN cur; 6FETCH NEXT FROM cur INTO @Name;
In this example, the FETCH statement attempts to place values from two columns into a single variable, resulting in an imbalance. This inconsistency can lead to errors, such as data loss or incorrect values being stored in variables, which can further complicate your data processing tasks.
-
Incorrect number of variables leads to runtime errors preventing code execution.
-
Mismatched assignments might lead to data inconsistencies and logical errors.

Ensure each column in the cursor’s SELECT list matches a corresponding local variable in the FETCH INTO clause to avoid mismatches and runtime errors.
Follow these steps to address the issue:
-
Examine the SELECT list in the cursor declaration to count the columns being selected.
-
Verify the INTO clause in the FETCH statement to ensure the number of variables matches the number of columns. Each column should correspond to a unique variable.
-
Adjust the INTO list or the SELECT list to correct any discrepancies. Add or remove variables as necessary to achieve one-to-one correspondence.
-
Test the modified cursor to confirm that it now operates without errors and behaves as expected.
For example:
1-- Corrected example of FETCH statement 2DECLARE cur CURSOR FOR 3SELECT FirstName, LastName FROM Employees; 4OPEN cur; 5FETCH NEXT FROM cur INTO @FirstName, @LastName;

The rule has a Batch scope and is applied only on the SQL script.

Rule has no parameters.

The rule does not need Analysis Context or SQL Connection.


Design Rules, Bugs


SQL
1declare @col1 int, @col2 int, @col3 int 2DECLARE test1 CURSOR 3 FOR SELECT col1,col2,col3 FROM Table1 4 5OPEN test1 6FETCH NEXT FROM test1 7 INTO @col1, @col2 8 9FETCH NEXT FROM test1 10 INTO @col1, @col2, @col3 11 12DECLARE test2 CURSOR 13 FOR SELECT col1,col2,col3, 4 FROM Table1 t 14 UNION ALL 15 SELECT 1, 2, 3, 4 FROM Table1 t 16OPEN test2 17FETCH NEXT FROM test2 18 INTO @col1, @col2,@col3 19 20DECLARE test3 CURSOR 21 FOR SELECT col1,col2,col3,t.* FROM Table1 t 22 UNION ALL 23 SELECT 1, 2, 3, t.* FROM Table1 t 24OPEN test3 25FETCH NEXT FROM test3 26 INTO @col1, @col2,@col3 |

Message | Line | Column | |
---|---|---|---|
1 | SA0258 : The number of FETCH statement variables is 2, while the number of columns in the cursor definition is 3. | 7 | 1 |
2 | SA0258 : The number of FETCH statement variables is 3, while the number of columns in the cursor definition is 4. | 18 | 1 |
