SQL update column via loop

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

klonerAsked:
Who is Participating?
 
ZberteocConnect With a Mentor Commented:
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
 
BrandonGalderisiConnect With a Mentor Commented:
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
 
klonerAuthor Commented:
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
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
BrandonGalderisiCommented:
So 001, 001, 001 would all need to be new records.  What is the PK of the table?
0
 
klonerAuthor Commented:
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
 
BrandonGalderisiCommented:
You should add an identity column and make it your PK.  I assume you don't have a clustered index either?
0
 
BrandonGalderisiCommented:
It seems like that's what you are trying to do with the ext_ref_id.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.