Reputation: 2983
Does any body know how to set different select statement for the same cursor? I need somethink like this.
DECLARE Temp_Cursor CURSOR FOR
IF(@TempVar = 1)
BEGIN
SELECT CustomerId FROM Customers
END
ELSE IF(@TempVar = 2)
BEGIN
SELECT OrderId FROM Orders
END
OPEN Temp_Cursor;
FETCH NEXT FROM TempCursor INTO @TempObjectId
WHILE @@FETCH_STATUS = 0
BEGIN
.... etc
I have found solution: DECLARE @Temp_Cursor CURSOR
IF(@TempVar = 1)
BEGIN
SET @Temp_Cursor = CURSOR FOR
SELECT CustomerId FROM Customers
END
ELSE IF(@TempVar = 2)
BEGIN
SET @Temp_Cursor = CURSOR FOR
SELECT OrderId FROM Orders
END
OPEN @Temp_Cursor;
FETCH NEXT FROM @TempCursor INTO @TempObjectId
WHILE @@FETCH_STATUS = 0
BEGIN
Upvotes: 2
Views: 7341
Reputation: 66697
Put the IF
outside and do two different cursors, one for each situation.
Like this:
IF(@TempVar = 1)
BEGIN
DECLARE Temp_Cursor CURSOR FOR
SELECT CustomerId FROM Customers
OPEN Temp_Cursor;
FETCH NEXT FROM TempCursor INTO @TempObjectId
WHILE @@FETCH_STATUS = 0
BEGIN
....
END
ELSE IF(@TempVar = 2)
BEGIN
DECLARE Temp_Cursor CURSOR FOR
SELECT OrderId FROM Orders
OPEN Temp_Cursor;
FETCH NEXT FROM TempCursor INTO @TempObjectId
WHILE @@FETCH_STATUS = 0
BEGIN
....
END
Another possibility is to use Dynamic SQL.
Upvotes: 1
Reputation: 10095
The complete query should be dynamic. That means the execution plan will come out at run time.
Example
Declare @SelectStatement Varchar(50)
Declare @SQL Varchar(50)
IF(@TempVar = 1)
BEGIN
Set @SelectStatement = SELECT CustomerId FROM Customers
END
ELSE IF(@TempVar = 2)
BEGIN
Set @SelectStatement = SELECT OrderId FROM Orders
END
Set @SQL = 'DECLARE Temp_Cursor CURSOR FOR
OPEN Temp_Cursor;
FETCH NEXT FROM TempCursor INTO ' + @TempObjectId +
'WHILE @@FETCH_STATUS = 0
BEGIN '
Upvotes: 1