2010-02-22 90 views
0

我正在使用SQL Server 2000,我遇到了将数据从一个表复制到另一个表的情况,目标数据表要求每个Name行都是唯一的。这里是我的问题的一个简单的例子将文本添加到字段以使其唯一

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

我想要做的就是把它在这个

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

名称列是一个varchar(40),对如何做任何的想法,我有2561行有重复,所以手工操作不是一个选项。

任何想法从哪里开始?

回答

0

我已经决定,我并不需要它每次都从1开始的,所以我就决定行ID列的contence在产品的最终复制。

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

如果它是一个1次交易,你要创建在您完成一个唯一约束:

的名字具有计数 从表 组创建临时表 选择名 (*) > 1

集rowCount时= 1个 更新基表 加入临时表上temp.name = base.name 集名称=名+ '(1)'

重复直到完成 删除全部(1)条目

对不起,您需要自己编写真实的SQL。如果你有SQL2K5,你可以使用Row_Number()来做到这一点。

0

你将需要一个游标。

类似下面:

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