Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2005 Forums
 Transact-SQL (2005)
 Help with cursor multiple insert or update

Author  Topic 

harlingtonthewizard
Constraint Violating Yak Guru

352 Posts

Posted - 2009-03-16 : 02:09:02
This is my first attempt with a cursor and so far I have failed:) I am trying to either update or insert a row into UserDetails depending if it exists in my temp table. Need to be able to run twice where on first run should insert and then on second run update.

Here is the UserDetails Table:

USE [VC]
GO
/****** Object: Table [dbo].[UserDetails] Script Date: 03/16/2009 15:35:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[UserDetails](
[UserID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[MiddleName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NOT NULL,
[Initials] [nvarchar](50) NULL,
[LoginName] [nvarchar](50) NOT NULL,
[LoginPassword] [nvarchar](50) NOT NULL,
[IsDeleted] [bit] NOT NULL,
[ProfileXMLFile] [varbinary](max) NULL,
[UserImageFileName] [nvarchar](max) NULL,
[UserNotes] [nvarchar](max) NULL,
[LastLoginTime] [datetime] NULL,
CONSTRAINT [PK_UserDetails] PRIMARY KEY CLUSTERED
(
[UserID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The ID of the user' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserDetails', @level2type=N'COLUMN',@level2name=N'UserID'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The login name of the user' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserDetails', @level2type=N'COLUMN',@level2name=N'LoginName'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Stores an encrypted copy of the users password' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserDetails', @level2type=N'COLUMN',@level2name=N'LoginPassword'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Flag used when a user is deleted' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserDetails', @level2type=N'COLUMN',@level2name=N'IsDeleted'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'This would enable us to display a picture of each user with the user report.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserDetails', @level2type=N'COLUMN',@level2name=N'UserImageFileName'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Last time when user lonin to the system. It''s serverside time, and will be null if user never login.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserDetails', @level2type=N'COLUMN',@level2name=N'LastLoginTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Stores information about a user' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserDetails'
GO



Here is what I have so far:

USE [VC]
GO
/****** Object: StoredProcedure [dbo].[CursorTest] Script Date: 03/13/2009 10:38:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[CursorTest]

As

--Create temp table
Create Table #t([FirstName] nvarchar(50), [MiddleName] nvarchar(50), [LastName] nvarchar(50), [Initials] nvarchar(50), [LoginName] nvarchar(50), [LoginPassword] nvarchar(50), [IsDeleted] bit, [ProfileXMLFile] varbinary(MAX), [UserImageFileName] nvarchar(MAX), [UserNotes] nvarchar(MAX), [LastLoginTime] DateTime)

--Add Data to temp table
Insert into #t
([FirstName], [MiddleName], [LastName], [Initials], [LoginName], [LoginPassword], [IsDeleted], [ProfileXMLFile], [UserImageFileName], [UserNotes], [LastLoginTime])
SELECT 'Steve', 'MiddleName', 'LastName', 'a', 'a', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL
SELECT 'Steve', 'MiddleName', 'LastName', 'b', 'b', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL
SELECT 'Steve', 'MiddleName', 'LastName', 'c', 'c', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL
SELECT 'Steve', 'MiddleName', 'LastName', 'd', 'd', 'Password', 0, NULL, NULL, 'UserNotes', NULL

--View temp table
Select * From #t

--**Start Procedure**--

DECLARE @rc INT

-- NO EXISTS ------------
BEGIN TRAN

--Declare the variables to store the values returned by FETCH.
DECLARE @FirstName nvarchar(50), @MiddleName nvarchar(50), @LastName nvarchar(50), @Initials nvarchar(50), @LoginName nvarchar(50), @LoginPassword nvarchar(50), @IsDeleted bit, @ProfileXMLFile varbinary(MAX), @UserImageFileName nvarchar(MAX), @UserNotes nvarchar(MAX), @LastLoginTime DateTime
DECLARE @Cursor Cursor

--Setup User Cursor
SET @Cursor = Cursor LOCAL FOR
Select [FirstName], [MiddleName], [LastName], [Initials], [LoginName], [LoginPassword], [IsDeleted], [ProfileXMLFile], [UserImageFileName], [UserNotes], [LastLoginTime]
From #t

--Open Cursor
OPEN @Cursor

-- Get Data from First Record in Cursor
FETCH NEXT FROM @Cursor INTO @FirstName, @MiddleName, @LastName, @Initials, @LoginName, @LoginPassword, @IsDeleted, @ProfileXMLFile, @UserImageFileName, @UserNotes, @LastLoginTime

WHILE @@FETCH_STATUS = 0

BEGIN
Print 'Update'

UPDATE UserDetails
SET [FirstName] = @FirstName,
[MiddleName] = @MiddleName,
[LastName] = @LastName,
[Initials] = @Initials,
[LoginName] = @LoginName,
[LoginPassword] = @LoginPassword,
[IsDeleted] = @IsDeleted,
[ProfileXMLFile] = @ProfileXMLFile,
[UserImageFileName] = @UserImageFileName,
[UserNotes] = @UserNotes,
[LastLoginTime] = @LastLoginTime

FETCH NEXT FROM @Cursor INTO @FirstName, @MiddleName, @LastName, @Initials, @LoginName, @LoginPassword, @IsDeleted, @ProfileXMLFile, @UserImageFileName, @UserNotes, @LastLoginTime
END
-- get rowcount
SELECT @rc = @@ROWCOUNT
Print @@ROWCOUNT

-- if update rowcount = 0 means that there is no such row so we insert it
IF @rc = 0
BEGIN
Print 'Insert'

INSERT INTO UserDetails
([FirstName], [MiddleName], [LastName], [Initials], [LoginName], [LoginPassword], [IsDeleted], [ProfileXMLFile], [UserImageFileName], [UserNotes], [LastLoginTime])
Select @FirstName, @MiddleName, @LastName, @Initials, @LoginName, @LoginPassword, @IsDeleted, @ProfileXMLFile, @UserImageFileName, @UserNotes, @LastLoginTime

FETCH NEXT FROM @Cursor INTO @FirstName, @MiddleName, @LastName, @Initials, @LoginName, @LoginPassword, @IsDeleted, @ProfileXMLFile, @UserImageFileName, @UserNotes, @LastLoginTime
END

CLOSE @Cursor
DEALLOCATE @Cursor

ROLLBACK

Select * From UserDetails

RETURN

Errors when run:

(4 row(s) affected)

(4 row(s) affected)
Update
Msg 2601, Level 14, State 1, Procedure Import_from_Excel_to_DB, Line 99
Cannot insert duplicate key row in object 'dbo.UserDetails' with unique index 'IX_UserDetails'.
The statement has been terminated.
Update
Msg 2601, Level 14, State 1, Procedure Import_from_Excel_to_DB, Line 99
Cannot insert duplicate key row in object 'dbo.UserDetails' with unique index 'IX_UserDetails'.
The statement has been terminated.
Update
Msg 2601, Level 14, State 1, Procedure Import_from_Excel_to_DB, Line 99
Cannot insert duplicate key row in object 'dbo.UserDetails' with unique index 'IX_UserDetails'.
The statement has been terminated.
Update
Msg 2601, Level 14, State 1, Procedure Import_from_Excel_to_DB, Line 99
Cannot insert duplicate key row in object 'dbo.UserDetails' with unique index 'IX_UserDetails'.
The statement has been terminated.
1
Insert

(1 row(s) affected)

(2 row(s) affected)

(1 row(s) affected)

Transact Charlie
Master Smack Fu Yak Hacker

3451 Posts

Posted - 2009-03-16 : 06:17:03
Well first off,

Do you *really* want to update every row in your userDetails column with the same variables?

Here's your UPDATE statement

UPDATE UserDetails
SET [FirstName] = @FirstName,
[MiddleName] = @MiddleName,
[LastName] = @LastName,
[Initials] = @Initials,
[LoginName] = @LoginName,
[LoginPassword] = @LoginPassword,
[IsDeleted] = @IsDeleted,
[ProfileXMLFile] = @ProfileXMLFile,
[UserImageFileName] = @UserImageFileName,
[UserNotes] = @UserNotes,
[LastLoginTime] = @LastLoginTime


No Where clause -- all rows will be updated to the same vars. Really what you wanted?

That's probably what's throwing your primary key validation error.


Charlie
===============================================================
Msg 3903, Level 16, State 1, Line 1736
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
Go to Top of Page

harlingtonthewizard
Constraint Violating Yak Guru

352 Posts

Posted - 2009-03-16 : 06:52:11
What I want is for the first time the procedure is run to insert the values from my temp table #t into the UserDetails table. The second time it is run I want the records to be updated in this test case with the same values again from the temp table. In other cases the values may change. I am trying to understand how a cursor can be used to step through one row at a time to either insert with new rows or update the existing rows respectively.

Should I add:
Where LoginName = @LoginName **This needs to be unique***
Go to Top of Page

robvolk
Most Valuable Yak

15732 Posts

Posted - 2009-03-16 : 07:47:01
quote:
I am trying to understand how a cursor can be used to step through one row at a time with either an insert or update with new rows or update to existing rows respectively
There's no need to use a cursor to do that:

INSERT INTO UserDetails
([FirstName], [MiddleName], [LastName], [Initials], [LoginName], [LoginPassword], [IsDeleted], [ProfileXMLFile], [UserImageFileName], [UserNotes], [LastLoginTime])
SELECT [FirstName], [MiddleName], [LastName], [Initials], [LoginName], [LoginPassword], [IsDeleted], [ProfileXMLFile], [UserImageFileName], [UserNotes], [LastLoginTime]
FROM #t t WHERE NOT EXISTS(SELECT * FROM UserDetails WHERE LoginName = t.LoginName)

UPDATE U SET [FirstName] = t.FirstName, [MiddleName] = t.MiddleName, [LastName] = t.LastName,
[Initials] = t.Initials, [LoginName] = t.LoginName, [LoginPassword] = t.LoginPassword,
[IsDeleted] = t.IsDeleted, [ProfileXMLFile] = t.ProfileXMLFile, [UserImageFileName] = t.UserImageFileName,
[UserNotes] = t.UserNotes, [LastLoginTime] = t.LastLoginTime
FROM UserDetails U INNER JOIN #t t on U.LoginName = t.LoginName


If you're using SQL Server 2008, you can also use the MERGE command to do it in one statement (I don't know the exact syntax off the top of my head so I can't post it, but it's in Books Online)
Go to Top of Page

Transact Charlie
Master Smack Fu Yak Hacker

3451 Posts

Posted - 2009-03-16 : 07:57:21
Rob's Right: No need for the cursor at all!

I'd switch the INSERT and UPDATE statements around though -- otherwise you perform UPDATES on data you don't need to


UPDATE U SET [FirstName] = t.FirstName, [MiddleName] = t.MiddleName, [LastName] = t.LastName,
[Initials] = t.Initials, [LoginName] = t.LoginName, [LoginPassword] = t.LoginPassword,
[IsDeleted] = t.IsDeleted, [ProfileXMLFile] = t.ProfileXMLFile, [UserImageFileName] = t.UserImageFileName,
[UserNotes] = t.UserNotes, [LastLoginTime] = t.LastLoginTime
FROM UserDetails U INNER JOIN #t t on U.LoginName = t.LoginName


INSERT INTO UserDetails
([FirstName], [MiddleName], [LastName], [Initials], [LoginName], [LoginPassword], [IsDeleted], [ProfileXMLFile], [UserImageFileName], [UserNotes], [LastLoginTime])
SELECT [FirstName], [MiddleName], [LastName], [Initials], [LoginName], [LoginPassword], [IsDeleted], [ProfileXMLFile], [UserImageFileName], [UserNotes], [LastLoginTime]
FROM #t t WHERE NOT EXISTS(SELECT * FROM UserDetails WHERE LoginName = t.LoginName)



Charlie
===============================================================
Msg 3903, Level 16, State 1, Line 1736
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
Go to Top of Page

robvolk
Most Valuable Yak

15732 Posts

Posted - 2009-03-16 : 08:08:32


Thanks Charlie.
Go to Top of Page

harlingtonthewizard
Constraint Violating Yak Guru

352 Posts

Posted - 2009-03-16 : 08:28:56
Thanks for you help however the point in part here is for me to learn how to use a cursor as I have never used one before.
Go to Top of Page

sakets_2000
Master Smack Fu Yak Hacker

1472 Posts

Posted - 2009-03-16 : 08:38:02
quote:
Originally posted by harlingtonthewizard

Thanks for you help however the point in part here is for me to learn how to use a cursor as I have never used one before.



You can look at examples in BOL. Here is one from there,

USE pubs
GO
DECLARE authors_cursor CURSOR FOR
SELECT au_lname FROM authors
WHERE au_lname LIKE "B%"
ORDER BY au_lname

OPEN authors_cursor

-- Perform the first fetch.
FETCH NEXT FROM authors_cursor

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM authors_cursor
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO
Go to Top of Page

Transact Charlie
Master Smack Fu Yak Hacker

3451 Posts

Posted - 2009-03-16 : 11:34:43
quote:

Thanks for you help however the point in part here is for me to learn how to use a cursor as I have never used one before.


Fair enough -- however, it's probably a bad example to choose for requiring a cursor. Rob's posted a way that you can do all that you need to using a set based approach. Whenever you find yourself contemplating a cursor you should really take a step back and "think how else could I do this?" There's usually a much better set based way.

Saying that -- lets break down your code: I've formatted it a bit to make things easier.

/****** Object: StoredProcedure [dbo].[CursorTest] Script Date: 03/13/2009 10:38:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[CursorTest]

AS

--Create temp table
Create Table #t(
[FirstName] nvarchar(50)
, [MiddleName] nvarchar(50)
, [LastName] nvarchar(50)
, [Initials] nvarchar(50)
, [LoginName] nvarchar(50)
, [LoginPassword] nvarchar(50)
, [IsDeleted] bit
, [ProfileXMLFile] varbinary(MAX)
, [UserImageFileName] nvarchar(MAX)
, [UserNotes] nvarchar(MAX)
, [LastLoginTime] DateTime
)

--Add Data to temp table
Insert into #t (
[FirstName]
, [MiddleName]
, [LastName]
, [Initials]
, [LoginName]
, [LoginPassword]
, [IsDeleted]
, [ProfileXMLFile]
, [UserImageFileName]
, [UserNotes]
, [LastLoginTime]
)
SELECT 'Steve', 'MiddleName', 'LastName', 'a', 'a', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL SELECT 'Steve', 'MiddleName', 'LastName', 'b', 'b', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL SELECT 'Steve', 'MiddleName', 'LastName', 'c', 'c', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL SELECT 'Steve', 'MiddleName', 'LastName', 'd', 'd', 'Password', 0, NULL, NULL, 'UserNotes', NULL

--View temp table
Select * From #t

--**Start Procedure**--
DECLARE @rc INT

-- NO EXISTS ------------
BEGIN TRAN

--Declare the variables to store the values returned by FETCH.
DECLARE
@FirstName nvarchar(50)
, @MiddleName nvarchar(50)
, @LastName nvarchar(50)
, @Initials nvarchar(50)
, @LoginName nvarchar(50)
, @LoginPassword nvarchar(50)
, @IsDeleted bit
, @ProfileXMLFile varbinary(MAX)
, @UserImageFileName nvarchar(MAX)
, @UserNotes nvarchar(MAX)
, @LastLoginTime DateTime

DECLARE @Cursor Cursor

--Setup User Cursor
SET @Cursor = Cursor LOCAL FOR
Select
[FirstName]
, [MiddleName]
, [LastName]
, [Initials]
, [LoginName]
, [LoginPassword]
, [IsDeleted]
, [ProfileXMLFile]
, [UserImageFileName]
, [UserNotes]
, [LastLoginTime]
From #t

--Open Cursor
OPEN @Cursor

-- Get Data from First Record in Cursor
FETCH NEXT FROM @Cursor INTO
@FirstName
, @MiddleName
, @LastName
, @Initials
, @LoginName
, @LoginPassword
, @IsDeleted
, @ProfileXMLFile
, @UserImageFileName
, @UserNotes
, @LastLoginTime

WHILE ( @@FETCH_STATUS = 0 ) BEGIN
-- This is the start of your loop

Print 'Update'

UPDATE UserDetails SET
[FirstName] = @FirstName
, [MiddleName] = @MiddleName
, [LastName] = @LastName
, [Initials] = @Initials
, [LoginName] = @LoginName
, [LoginPassword] = @LoginPassword
, [IsDeleted] = @IsDeleted
, [ProfileXMLFile] = @ProfileXMLFile
, [UserImageFileName] = @UserImageFileName
, [UserNotes] = @UserNotes
, [LastLoginTime] = @LastLoginTime
-- NEED a WHERE clause here on whatever primary key you have -- otherwise you are just updating everything in the table rather than one entry

-- This is wrong I think -- why do you want to move on to the next data item in your CURSOR before doing the insert? -- I thought the whole point was to update a value if required OR insert it if it doesn't exist. This FETCH is replacing the variables with the data next in your cursor.
FETCH NEXT FROM @Cursor INTO
@FirstName
, @MiddleName
, @LastName
, @Initials
, @LoginName
, @LoginPassword
, @IsDeleted
, @ProfileXMLFile
, @UserImageFileName
, @UserNotes
, @LastLoginTime
-- This is the end of the loop. therefore you will go back up to the start of your loop -- your INSERT will not process until this loop has finished. That doesn't seem to be what you wanted
END

-- get rowcount
SELECT @rc = @@ROWCOUNT
-- I'm not toatllu sure about this but I think this might return the @@ROWCOUNT of the CURSOR oporation and not the UPDATE that you were expecting it to. WHen you reference any of these system variables (@@ROWCOUNT, @@IDENTITY, @@ERROR) etc you should do so as soon as possible before dowing anything else -- therefore this should be immediately after the UPDATE op and not after the FETCH

Print @@ROWCOUNT

-- if update rowcount = 0 means that there is no such row so we insert it
IF @rc = 0 BEGIN
Print 'Insert'

INSERT INTO UserDetails (
[FirstName]
, [MiddleName]
, [LastName]
, [Initials]
, [LoginName]
, [LoginPassword]
, [IsDeleted]
, [ProfileXMLFile]
, [UserImageFileName]
, [UserNotes]
, [LastLoginTime]
)
Select
@FirstName
, @MiddleName
, @LastName
, @Initials
, @LoginName
, @LoginPassword
, @IsDeleted
, @ProfileXMLFile
, @UserImageFileName
, @UserNotes
, @LastLoginTime

-- This is very wrong! -- the cursor LOOP has finsihed with a fetchstatus <> 0 (I'E no data) therefore what's the point of this FETCH?
FETCH NEXT FROM @Cursor INTO
@FirstName
, @MiddleName
, @LastName
, @Initials
, @LoginName
, @LoginPassword
, @IsDeleted
, @ProfileXMLFile
, @UserImageFileName
, @UserNotes
, @LastLoginTime
END

CLOSE @Cursor
DEALLOCATE @Cursor

ROLLBACK

Select * From UserDetails

RETURN





Charlie
===============================================================
Msg 3903, Level 16, State 1, Line 1736
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
Go to Top of Page

harlingtonthewizard
Constraint Violating Yak Guru

352 Posts

Posted - 2009-03-17 : 00:15:47
Thanks for your help guys. This seems to work for insert new row or update existing row. I will not be using this, as mentioned this was just a learning example.

--Create temp table
Create Table #t([FirstName] nvarchar(50), [MiddleName] nvarchar(50), [LastName] nvarchar(50), [Initials] nvarchar(50), [LoginName] nvarchar(50), [LoginPassword] nvarchar(50), [IsDeleted] bit, [ProfileXMLFile] varbinary(MAX), [UserImageFileName] nvarchar(MAX), [UserNotes] nvarchar(MAX), [LastLoginTime] DateTime)
--Add Data to temp table
Insert into #t
([FirstName], [MiddleName], [LastName], [Initials], [LoginName], [LoginPassword], [IsDeleted], [ProfileXMLFile], [UserImageFileName], [UserNotes], [LastLoginTime])
SELECT 'Steve', 'MiddleName', 'LastName', 'a', 'a', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL
SELECT 'Steve', 'MiddleName', 'LastName', 'b', 'b', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL
SELECT 'Steve', 'MiddleName', 'LastName', 'c', 'c', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL
SELECT 'Steve', 'MiddleName', 'LastName', 'd', 'd', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL
SELECT 'Steve', 'MiddleName', 'LastName', 'e', 'e', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL
SELECT 'Steve', 'MiddleName', 'LastName', 'f', 'f', 'Password', 0, NULL, NULL, 'UserNotes', NULL
UNION ALL
SELECT '', NULL, '', NULL, 'test', 'test5', 0, NULL, NULL, NULL, NULL


--**Start Procedure**--
DECLARE @rc INT

-- NO EXISTS ------------
--BEGIN TRAN

--Declare the variables to store the values returned by FETCH.
DECLARE @FirstName nvarchar(50),
@MiddleName nvarchar(50),
@LastName nvarchar(50),
@Initials nvarchar(50),
@LoginName nvarchar(50),
@LoginPassword nvarchar(50),
@IsDeleted bit,
@ProfileXMLFile varbinary(MAX),
@UserImageFileName nvarchar(MAX),
@UserNotes nvarchar(MAX),
@LastLoginTime DateTime

DECLARE @Cursor Cursor

--Setup User Cursor
SET @Cursor = Cursor LOCAL FOR
Select [FirstName],
[MiddleName],
[LastName],
[Initials],
[LoginName],
[LoginPassword],
[IsDeleted],
[ProfileXMLFile],
[UserImageFileName],
[UserNotes],
[LastLoginTime]
From #t

--Open Cursor
OPEN @Cursor

-- Get Data from First Record in Cursor
FETCH NEXT FROM @Cursor INTO
@FirstName,
@MiddleName,
@LastName,
@Initials,
@LoginName,
@LoginPassword,
@IsDeleted,
@ProfileXMLFile,
@UserImageFileName,
@UserNotes,
@LastLoginTime
--Start Loop
WHILE @@FETCH_STATUS = 0
BEGIN

BEGIN

Print 'Update'

UPDATE UserDetails
SET [FirstName] = @FirstName,
[MiddleName] = @MiddleName,
[LastName] = @LastName,
[Initials] = @Initials,
[LoginName] = @LoginName,
[LoginPassword] = @LoginPassword,
[IsDeleted] = @IsDeleted,
[ProfileXMLFile] = @ProfileXMLFile,
[UserImageFileName] = @UserImageFileName,
[UserNotes] = @UserNotes,
[LastLoginTime] = @LastLoginTime

Where LoginName = @LoginName

END

SELECT @rc = @@ROWCOUNT
IF @rc = 0

BEGIN

Print 'Insert'
INSERT INTO UserDetails
([FirstName],
[MiddleName],
[LastName],
[Initials],
[LoginName],
[LoginPassword],
[IsDeleted],
[ProfileXMLFile],
[UserImageFileName],
[UserNotes],
[LastLoginTime])

Select @FirstName,
@MiddleName,
@LastName,
@Initials,
@LoginName,
@LoginPassword,
@IsDeleted,
@ProfileXMLFile,
@UserImageFileName,
@UserNotes,
@LastLoginTime
END

FETCH NEXT FROM @Cursor INTO
@FirstName,
@MiddleName,
@LastName,
@Initials,
@LoginName,
@LoginPassword,
@IsDeleted,
@ProfileXMLFile,
@UserImageFileName,
@UserNotes,
@LastLoginTime

END
CLOSE @Cursor
DEALLOCATE @Cursor

--COMMIT TRANSACTION

Select * From #t

Select * From UserDetails

RETURN
Go to Top of Page
   

- Advertisement -