DevPinoy.org
A Filipino Developers Community
   
How To: Create Cursors For Updating and Deleting of Records in SQL

Here are some samples on how to use cursors in SQL to do updates and deletes on records. Nothing fancy, just pure t-sql code. :)

Updating of Records Sample

[code language="T-SQL"]

--EXAMPLE ONE
SET NOCOUNT ON
Declare @AccountNumber varchar(20)

DECLARE AccountNumbers CURSOR FOR
( select AccountNumber from OldAccountsTable
 where AccountNumber between '0807200' and  '0807999'
)
 
OPEN AccountNumbers

 FETCH NEXT FROM AccountNumbers INTO @AccountId

 WHILE @@FETCH_STATUS = 0
  BEGIN

   UPDATE AccountTable
   SET AccountType = 3
   WHERE AccountNumber = @AccountNumber

   FETCH NEXT FROM AccountNumbers INTO @AccountNumber
  END
CLOSE AccountNumbers
DEALLOCATE AccountNumbers

--EXAMPLE TWO
SET NOCOUNT ON
Declare @AccountNumber varchar(20)
DECLARE @SqlStatement varchar(8000)

DECLARE AccountNumbers CURSOR FOR
( select AccountNumber from OldAccountsTable
 where AccountNumber between '0807200' and  '0807999'
)
 
OPEN AccountNumbers

 FETCH NEXT FROM AccountNumbers INTO @AccountId

 WHILE @@FETCH_STATUS = 0
  BEGIN
   
   --SET THE STATEMENT TO EXECUTE
   SET @SqlStatement =
   'UPDATE AccountTable
   SET AccountType = 3
   WHERE AccountNumber =' + @AccountNumber
   
   --EXECUTE THE STATEMENT
   exec(@SqlStatement)

   --PRINT THE STATEMENT IF AN ERROR HAS BEEN ENCOUNTERED
   IF (@@ERROR <> 0)
    print @SqlStatement

   FETCH NEXT FROM AccountNumbers INTO @AccountNumber
  END
CLOSE AccountNumbers
DEALLOCATE AccountNumbers

[/code]

Deleting of Records sample

[code language="T-SQL"]

-- EXAMPLE ONE
SET NOCOUNT ON
Declare @AccountNumber varchar(20)

DECLARE AccountNumbers CURSOR FOR
( select AccountNumber from OldAccountsTable
 where AccountNumber between '0807200' and  '0807999'
)
 
OPEN AccountNumbers

 FETCH NEXT FROM AccountNumbers INTO @AccountId

 WHILE @@FETCH_STATUS = 0
  BEGIN

   DELETE FROM AccountTable
   WHERE AccountNumber  = @AccountNumber

   FETCH NEXT FROM AccountNumbers INTO @AccountNumber
  END
CLOSE AccountNumbers
DEALLOCATE AccountNumbers

-- EXAMPLE TWO
SET NOCOUNT ON
Declare @AccountNumber varchar(20)

DECLARE AccountNumbers CURSOR FOR
( select AccountNumber from OldAccountsTable
 where AccountNumber between '0807200' and  '0807999'
)
 
OPEN AccountNumbers

 FETCH NEXT FROM AccountNumbers INTO @AccountId

 WHILE @@FETCH_STATUS = 0
  BEGIN

   --SET THE STATEMENT TO EXECUTE
   SET @SqlStatement =
   'DELETE FROM AccountTable
   WHERE AccountNumber=' @AccountNumber

   --EXECUTE THE STATEMENT
   exec(@SqlStatement)

   --PRINT THE STATEMENT IF AN ERROR HAS BEEN ENCOUNTERED
   IF (@@ERROR <> 0)
    print @SqlStatement

   FETCH NEXT FROM AccountNumbers INTO @AccountNumber
  END
CLOSE AccountNumbers
DEALLOCATE AccountNumbers

[/code]


Posted 04-18-2006 12:02 PM by keithrull

Comments

bonskijr wrote OR you can simply use:
on 04-18-2006 10:36 PM
UPDATE AccountTable SET AccountNumber = 3
FROM AccountTable INNER JOIN oldAccountTable ON AccountTable.AccountNumber = oldAccountTable.AccountNumber
WHERE oldAccountTable.AccountNumber BETWEEN '0807200' AND '0807999'
bonskijr wrote re: sorry should be...
on 04-18-2006 11:07 PM
--- UPDATE
UPDATE AccountTable SET AccountType = 3
FROM AccountTable INNER JOIN oldAccountTable ON AccountTable.AccountNumber = oldAccountTable.AccountNumber
WHERE oldAccountTable.AccountNumber BETWEEN '0807200' AND '0807999' --;)

-- DELETE
DELETE FROM AccountTable
WHERE AccountTable.AccountNumber IN ( SELECT oldAccountTable.AccountNumber
FROM oldAccountTable
WHERE oldAccountTable.AccountNumber BETWEEN '0807200' AND '0807999' )

or simply

DELETE FROM AccountTable
WHERE AccountNumber BETWEEN '0807200' AND '0807999'
keithrull wrote re: How To: Create Cursors For Updating and Deleting of Records in SQL
on 04-19-2006 9:48 AM
true!

the idea behind the samples was just to show how to use cursors for updates and delete. i didnt consider the fact that this task can be achieve by a more simpler approach that doesnt need cursors.

thanks for the clarification bonskijr :)
Copyright DevPinoy 2005-2008