РЕДАКТИРОВАТЬ: я изменил запрос, чтобы использовать ваши имена полей и добавил запрос "только для выбора" для предварительного просмотра.
Это на самом деле довольно легко сделать ... просто используйте ROW_NUMBER () с предложением PARTITION:
UPDATE Persons SET UniqueName = temp.DeDupded FROM
(SELECT ID,
CASE WHEN ROW_NUMBER() OVER
(PARTITION BY UniqueName ORDER BY UniqueName) = 1 THEN UniqueName
ELSE UniqueName + CONVERT(VARCHAR, ROW_NUMBER()
OVER (PARTITION BY UniqueName ORDER BY UniqueName)-1) END AS DeDupded
FROM Persons) temp
WHERE Persons.ID = temp.ID
Если вы хотите «только для выбора», то вот вам:
SELECT ID,
CASE WHEN ROW_NUMBER() OVER
(PARTITION BY UniqueName ORDER BY UniqueName) = 1 THEN UniqueName
ELSE UniqueName + CONVERT(VARCHAR, ROW_NUMBER()
OVER (PARTITION BY UniqueName ORDER BY UniqueName)-1) END AS DeDupded
FROM Persons
Снова отредактируйте: если вы ищете решение SQL Server 2000 ...
CREATE TABLE #Persons ( ID INT IDENTITY(1, 1), UniqueName VARCHAR(100) )
INSERT INTO #Persons VALUES ('Bob')
INSERT INTO #Persons VALUES ('Bob')
INSERT INTO #Persons VALUES ('Bob')
INSERT INTO #Persons VALUES ('John')
INSERT INTO #Persons VALUES ('John')
SELECT
ID,
CASE WHEN Position = 0 THEN UniqueName
ELSE UniqueName + (CONVERT(VARCHAR, Position))
END AS UniqueName
FROM
(SELECT
ID,
UniqueName,
(SELECT COUNT(*) FROM #Persons p2 WHERE
p1.UniqueName = p2.UniqueName AND p1.ID > p2.ID) AS Position
FROM
#Persons p1) _temp
DROP TABLE #Persons