2011-09-03 64 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次重複。:-) –

相關問題