Solved

SQL update column via loop

Posted on 2008-10-01
7
755 Views
Last Modified: 2010-08-05
Simple really

Need to update a column's value, by appending 1 to a counter and adding a string to it ...

SQL code should explain it all ...
-- Grab the max ext_ref_id and add one.

DECLARE @MAX_EXT_REF_ID AS INTEGER
 

SELECT @MAX_EXT_REF_ID = MAX(CAST(REPLACE(EXT_REF_ID, '_BLC', '') AS INTEGER)) + 1 

FROM [TBL_BLUECARE_CANDIDATES] 

WHERE [EXT_REF_ID] like '%_BLC'
 

SELECT @MAX_EXT_REF_ID -- RETURNS 78656
 
 

--SELECT ALL USERS THAT DO NOT HAVE '_BLC' in the [EXT_REF_ID]

SELECT [EXT_REF_ID]

FROM   [TBL_BLUECARE_CANDIDATES]

WHERE  [EXT_REF_ID] not like '%_BLC'

ORDER BY [EXT_REF_ID]
 

/* RETURNS DATA LIKE 
 

000

0001

001

002

003003003

007

01

079091

10661

11101110

11986

121212123

12335

1234
 

*/
 
 

-- NEED TO UPDATE ALL [EXT_REF_ID] WITHOUT '_BLC' and APPEND @MAX_EXT_REF_ID + 1 + '_BLC'

--  eg. 78656_BLC

--  eg. 78657_BLC

--  eg. 78658_BLC

--  eg. 78659_BLC
 

BEGIN LOOP 

	FOR EACH RECORD IN QUERY ABOVE

	UPDATE [EXT_REF_ID] = (@MAX_EXT_REF_ID + 1) + '_BLC'

END LOOP

Open in new window

0
Comment
Question by:kloner
  • 4
  • 2
7 Comments
 
LVL 39

Assisted Solution

by:BrandonGalderisi
BrandonGalderisi earned 50 total points
Comment Utility
Try this....

After you see if it works, remove the begin tran/rollback.
begin tran

DECLARE @MAX_EXT_REF_ID AS INTEGER

 

SELECT @MAX_EXT_REF_ID = MAX(CAST(REPLACE(EXT_REF_ID, '_BLC', '') AS INTEGER)) + 1 

FROM [TBL_BLUECARE_CANDIDATES] 

WHERE [EXT_REF_ID] like '%_BLC'
 

;with theRef as(

SELECT [EXT_REF_ID],row_number() over(order by [ext_Ref_id]) + @Max_ext_ref_id as rn

FROM   [TBL_BLUECARE_CANDIDATES]

WHERE  [EXT_REF_ID] not like '%_BLC')
 

update bcc

set ext_ref_id = cast(rn as varchar(16))+'_BLC'

from [tbl_bluecare_candidates] bcc

join theRef r

on bcc.ext_ref_id = r.ext_ref_id
 

select * from [tbl_bluecare_candidates]
 

rollback

Open in new window

0
 

Author Comment

by:kloner
Comment Utility
I forgot to mention ... some of the existing [EXT_REF_ID] data that we are trying to update actually contains dulpicate data ... hence we can't rely on the join statement you suggested ... on bcc.ext_ref_id = r.ext_ref_id

.......

Current output dump:

000
000
0001
001
001
001
002
003003003
007
01
079091
10661
11101110
11986
11986
0
 
LVL 39

Expert Comment

by:BrandonGalderisi
Comment Utility
So 001, 001, 001 would all need to be new records.  What is the PK of the table?
0
Control application downtime with dependency maps

Visualize the interdependencies between application components better with Applications Manager's automated application discovery and dependency mapping feature. Resolve performance issues faster by quickly isolating problematic components.

 

Author Comment

by:kloner
Comment Utility
Well you won't believe this ... ther's no bloody PK in this OLD DB ... I can just get the duplicate records and manually update them hey as a quick win ...
0
 
LVL 39

Expert Comment

by:BrandonGalderisi
Comment Utility
You should add an identity column and make it your PK.  I assume you don't have a clustered index either?
0
 
LVL 39

Expert Comment

by:BrandonGalderisi
Comment Utility
It seems like that's what you are trying to do with the ext_ref_id.
0
 
LVL 26

Accepted Solution

by:
Zberteoc earned 75 total points
Comment Utility
Here:
-- max value variable

DECLARE 

	@MAX_EXT_REF_ID int
 

-- get max value !!! WITHOUT ADDING 1 !!!

SELECT 

	@MAX_EXT_REF_ID = MAX(CAST(REPLACE(EXT_REF_ID, '_BLC', '') AS int)) 

FROM 

	[TBL_BLUECARE_CANDIDATES] 

WHERE 

	[EXT_REF_ID] like '%_BLC'
 
 

-- insert the distinct wanted [EXT_REF_ID] in a temp table

SELECT DISTINCT  

	[EXT_REF_ID]

INTO #aux

FROM   

	[TBL_BLUECARE_CANDIDATES] bc

WHERE  

	[EXT_REF_ID] not like '%_BLC'

ORDER BY

	[EXT_REF_ID]
 

-- add an identity column

ALTER TABLE #aux ADD id int identity
 

-- replace the [EXT_REF_ID] using the identity and @MAX_EXT_REF_ID

UPDATE bc SET

	[EXT_REF_ID]=id+@MAX_EXT_REF_ID

FROM

	[TBL_BLUECARE_CANDIDATES] bc

	INNER JOIN #aux a

		on a.[EXT_REF_ID]=bc.[EXT_REF_ID]

Open in new window

0

Featured Post

Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Suggested Solutions

Recently, when I was asked to create a new SQL 2005 cluster, Microsoft released a new service pack for MS SQL 2005 what is Service Pack 3. When I finished the installation of MS SQL 2005 I found myself troubled why the installation of SP3 failed …
by Mark Wills Attending one of Rob Farley's seminars the other day, I heard the phrase "The Accidental DBA" and fell in love with it. It got me thinking about the plight of the newcomer to SQL Server...  So if you are the accidental DBA, or, simp…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now