2010-02-22 88 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