2010-02-22 7 views
0

J'utilise SQL Server 2000, j'ai une situation où je copie des données d'une table à l'autre, la table de données de destination exige que chaque rangée de nom soit unique. Voici un exemple rapide de mon problèmeAjout de texte à un champ pour le rendre unique

Source table 
RowID | Name 
1  A 
2  B 
3  B 
4  B 
5  C 
6  D 
7  C 

Ce que je veux faire est de tourner dans ce

Destination table 
RowID | Name 
1  A 
2  B 
3  B(2) 
4  B(3) 
5  C 
6  D 
7  C(2) 

La colonne Nom est un varchar (40), une idée sur la façon dont faire pour elle , J'ai 2561 lignes qui ont des doublons donc le faire à la main n'est pas une option.

Des idées sur par où commencer?

Répondre

0

J'ai décidé que je ne pas besoin à partir de 1 chaque fois donc je viens décidé de copier le contence de la colonne ID de ligne à la fin du produit.

update #Inv 
set name = left(rtrim(name), 40-len(RowId)-1) + ' ' + RowId 
where name in (SELECT distinct name 
       FROM [#Inv] a 
       WHERE exists (select [name] from [#Inv] where not [RowId] = a.[RowId] and [name] = a.[name])) 
0

Si c'est une affaire 1-temps et vous allez créer une contrainte unique lorsque vous obtenez fait:

créer une table temporaire select name de la table groupe par nom ayant count (*) > 1

set rowcount = 1 mise à jour table de base joindre table temporaire sur temp.name = base.name nom du jeu = nom + '(1)'

répéter jusqu'à faire Enlever tous (1) entrées

Désolé, vous aurez besoin d'écrire le vrai SQL vous-même. Si vous aviez SQL2K5, vous pourriez utiliser Row_Number() pour le faire.

0

Vous allez avoir besoin d'un curseur.

Quelque chose comme ci-dessous:

CREATE TABLE TempTable (RowID INT IDENTITY PRIMARY KEY, SomeValue varchar(10)) 
INSERT INTO TempTable (SomeValue) VALUES('A') 
INSERT INTO TempTable (SomeValue) VALUES('B') 
INSERT INTO TempTable (SomeValue) VALUES('B') 
INSERT INTO TempTable (SomeValue) VALUES('B') 
INSERT INTO TempTable (SomeValue) VALUES('C') 
INSERT INTO TempTable (SomeValue) VALUES('C') 
INSERT INTO TempTable (SomeValue) VALUES('D') 
INSERT INTO TempTable (SomeValue) VALUES('D') 
INSERT INTO TempTable (SomeValue) VALUES('D') 
INSERT INTO TempTable (SomeValue) VALUES('D') 


CREATE TABLE #Counts (SomeValue varchar(10), ValCount int CONSTRAINT COunts_Unique UNIQUE(SomeValue)) 
INSERT INTO #Counts(SomeValue, ValCount) 
SELECT DISTINCT SomeValue, 0 FROM TempTable 

DECLARE @RowID int 
DECLARE @SomeValue VARCHAR(10) 
DECLARE @ValCount int 
DECLARE curs CURSOR for SELECT RowID, SomeValue FROM TempTable ORDER BY RowID ASC 
OPEN curs 
FETCH NEXT FROM curs into @RowID, @SomeValue 
WHILE(@@FETCH_STATUS = 0) 
BEGIN 
    SELECT @ValCount = ValCount FROM #Counts WHERE SomeValue = @SomeValue 
    IF(@ValCount > 0) 
    BEGIN 
     UPDATE TempTable 
     SET SomeValue = SomeValue + '(' + Convert(varchar, @valCount) + ')' 
     WHERE RowID = @RowID 
    END 

    UPDATE #Counts SET ValCount = ValCount + 1 where SomeValue = @SomeValue 

    FETCH NEXT FROM curs into @RowID, @SomeValue 
END 
CLOSE curs 
DEALLOCATE curs 

DROP TABLE #Counts 
Questions connexes