2011-09-03 40 views
1

我有像一个列的表(FORM):改变重复的行为唯一值

Serialno 

424 

536700045 

345293885 

424 

466758884 

424 

424 

244002678 

我的目标是改变424重复行至424+(唯一的6位数字),但下面的查询最终改变的424所有发生到424748793.

我需要查询生成的每一行与424重复不计首424

由于独特的价值。

declare @count int 

declare @num varchar (9) 

declare @id varchar (9) 

dcelare @generic varchar(9) 

set @id = RIGHT('000000' + CAST(ABS(CHECKSUM(NEWID())) % 999999 AS varchar(6)), 6) 

set @num= '424' 

set @generic = @[email protected] 

select @count= COUNT(serialno) from FORM 

where serialno = '424' 

while @count <> 1 

begin 

update FORM SET Serialno = @generic WHERE serialno = '424' 

set @count = @count-1 

end 
+0

马修和吉娜是同一个人吗?这看起来非常类似于http://stackoverflow.com/questions/7285036/generate-unique-9-digits-values/ –

回答

2

如果您有任何其他主键列,那么您可以根据主键值更新您的数据,该键值对所有记录都是唯一的。

SELECT Col1, Col2, Serialno,ROW_NUMBER() OVER(ORDER BY Serialno) AS RowNo INTO #TempTable FROM FormTable 

UPDATE #TempTable 
SET Serialno = Serialno + RIGHT('000000' + CAST(ABS(CHECKSUM(NEWID())) % 999999 AS varchar(6)), 6) 
WHERE RowNo <> 1 

DELETE FROM TestTable WHERE Serialno = '424' 

INSERT INTO TestTable 
SELECT Col1,Col2 Serialno FROM #TempTable 

DROP TABLE #TempTable 
+0

+1但是,您不需要为此使用中间'#temp'表。 –

+0

是的,我检查了你的答案。这是最好的。 –

1

要重现当前的逻辑,你会需要做的仅仅

UPDATE FORM 
SET Serialno = '424' + 
    RIGHT('000000' + CAST(ABS(CHECKSUM(NEWID())) % 999999 AS VARCHAR(6)), 6) 
WHERE serialno = '424' 

:如您有没有任何其他的主键列,那么你可以通过使用临时表和ROW_NUMBER函数像下面这样做当然,这并不能保证所有新生成的值都是唯一的,或者它们不会与表中任何预先存在的值冲突。

如果您的表格不存在424xxxxxx您可以按如下方式分配顺序序列号。

;WITH CTE AS 
(
SELECT *, 
     ROW_NUMBER() OVER (ORDER BY $/0) AS RN 
FROM FORM 
WHERE serialno = '424' 
) 
UPDATE CTE 
SET Serialno = '424' + RIGHT('000000' + CAST(RN AS VARCHAR(6)), 6) 
+0

除非有> 999,999的424次重复。:-) –