我有一个表格(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 = @id+@num
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 :(得分:2)
如果您有任何其他主键列,则可以根据所有记录唯一的主键值更新数据。如果您没有任何其他主键列,那么您可以使用如下所示的临时表和row_number函数来执行此操作:
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
答案 1 :(得分:1)
要重现您当前的逻辑,您只需要
UPDATE FORM
SET Serialno = '424' +
RIGHT('000000' + CAST(ABS(CHECKSUM(NEWID())) % 999999 AS VARCHAR(6)), 6)
WHERE serialno = '424'
当然,这并不能保证所有新生成的值都是唯一的,或者它们不会与表中任何预先存在的值冲突。
如果您的表格中没有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)