| 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 ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE 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]GOSET ANSI_PADDING OFFGOEXEC 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'GOEXEC 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'GOEXEC 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'GOEXEC 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'GOEXEC 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'GOEXEC 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'GOEXEC 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'GOHere is what I have so far:USE [VC]GO/****** Object: StoredProcedure [dbo].[CursorTest] Script Date: 03/13/2009 10:38:23 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: <Author,,Name>-- Create date: <Create Date,,>-- Description: <Description,,>-- =============================================CREATE PROCEDURE [dbo].[CursorTest] As--Create temp tableCreate 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 tableInsert into #t([FirstName], [MiddleName], [LastName], [Initials], [LoginName], [LoginPassword], [IsDeleted], [ProfileXMLFile], [UserImageFileName], [UserNotes], [LastLoginTime])SELECT 'Steve', 'MiddleName', 'LastName', 'a', 'a', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALLSELECT 'Steve', 'MiddleName', 'LastName', 'b', 'b', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALLSELECT 'Steve', 'MiddleName', 'LastName', 'c', 'c', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALLSELECT 'Steve', 'MiddleName', 'LastName', 'd', 'd', 'Password', 0, NULL, NULL, 'UserNotes', NULL--View temp tableSelect * 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 @CursorROLLBACKSelect * From UserDetailsRETURNErrors when run:(4 row(s) affected)(4 row(s) affected)UpdateMsg 2601, Level 14, State 1, Procedure Import_from_Excel_to_DB, Line 99Cannot insert duplicate key row in object 'dbo.UserDetails' with unique index 'IX_UserDetails'.The statement has been terminated.UpdateMsg 2601, Level 14, State 1, Procedure Import_from_Excel_to_DB, Line 99Cannot insert duplicate key row in object 'dbo.UserDetails' with unique index 'IX_UserDetails'.The statement has been terminated.UpdateMsg 2601, Level 14, State 1, Procedure Import_from_Excel_to_DB, Line 99Cannot insert duplicate key row in object 'dbo.UserDetails' with unique index 'IX_UserDetails'.The statement has been terminated.UpdateMsg 2601, Level 14, State 1, Procedure Import_from_Excel_to_DB, Line 99Cannot insert duplicate key row in object 'dbo.UserDetails' with unique index 'IX_UserDetails'.The statement has been terminated.1Insert(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 UserDetailsSET [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 1736The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION |
 |
|
|
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*** |
 |
|
|
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.LastLoginTimeFROM UserDetails U INNER JOIN #t t on U.LoginName = t.LoginNameIf 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) |
 |
|
|
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 toUPDATE 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.LastLoginTimeFROM UserDetails U INNER JOIN #t t on U.LoginName = t.LoginNameINSERT 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 1736The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION |
 |
|
|
robvolk
Most Valuable Yak
15732 Posts |
Posted - 2009-03-16 : 08:08:32
|
Thanks Charlie. |
 |
|
|
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. |
 |
|
|
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 pubsGODECLARE authors_cursor CURSOR FORSELECT au_lname FROM authorsWHERE au_lname LIKE "B%"ORDER BY au_lnameOPEN 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 = 0BEGIN -- This is executed as long as the previous fetch succeeds. FETCH NEXT FROM authors_cursorENDCLOSE authors_cursorDEALLOCATE authors_cursorGO |
 |
|
|
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 ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: <Author,,Name>-- Create date: <Create Date,,>-- Description: <Description,,>-- =============================================CREATE PROCEDURE [dbo].[CursorTest] AS--Create temp tableCreate 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 tableInsert into #t ( [FirstName] , [MiddleName] , [LastName] , [Initials] , [LoginName] , [LoginPassword] , [IsDeleted] , [ProfileXMLFile] , [UserImageFileName] , [UserNotes] , [LastLoginTime] ) SELECT 'Steve', 'MiddleName', 'LastName', 'a', 'a', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALL SELECT 'Steve', 'MiddleName', 'LastName', 'b', 'b', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALL SELECT 'Steve', 'MiddleName', 'LastName', 'c', 'c', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALL SELECT 'Steve', 'MiddleName', 'LastName', 'd', 'd', 'Password', 0, NULL, NULL, 'UserNotes', NULL--View temp tableSelect * 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 DateTimeDECLARE @Cursor Cursor--Setup User CursorSET @Cursor = Cursor LOCAL FORSelect [FirstName] , [MiddleName] , [LastName] , [Initials] , [LoginName] , [LoginPassword] , [IsDeleted] , [ProfileXMLFile] , [UserImageFileName] , [UserNotes] , [LastLoginTime]From #t--Open CursorOPEN @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 ENDCLOSE @CursorDEALLOCATE @CursorROLLBACKSelect * From UserDetailsRETURN Charlie===============================================================Msg 3903, Level 16, State 1, Line 1736The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION |
 |
|
|
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 tableCreate 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 tableInsert into #t([FirstName], [MiddleName], [LastName], [Initials], [LoginName], [LoginPassword], [IsDeleted], [ProfileXMLFile], [UserImageFileName], [UserNotes], [LastLoginTime])SELECT 'Steve', 'MiddleName', 'LastName', 'a', 'a', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALLSELECT 'Steve', 'MiddleName', 'LastName', 'b', 'b', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALLSELECT 'Steve', 'MiddleName', 'LastName', 'c', 'c', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALLSELECT 'Steve', 'MiddleName', 'LastName', 'd', 'd', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALLSELECT 'Steve', 'MiddleName', 'LastName', 'e', 'e', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALLSELECT 'Steve', 'MiddleName', 'LastName', 'f', 'f', 'Password', 0, NULL, NULL, 'UserNotes', NULLUNION ALLSELECT '', 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 TRANSACTIONSelect * From #tSelect * From UserDetailsRETURN |
 |
|
|
|
|
|