将文本添加到字段以使其唯一

时间:2010-02-22 17:38:02

标签: sql-server sql-server-2000 unique-constraint

我正在使用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)

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

关于从哪里开始的任何想法?

3 个答案:

答案 0 :(得分:0)

如果这是一次性交易,你将在完成后创建一个独特的约束:

创建临时表 选择名称   从表   按名称分组   有计数(*)> 1

设置rowCount = 1 更新基表  在temp.name = base.name上连接临时表    set name = name +'(1)'

重复直到完成 删除所有(1)条目

抱歉,您需要自己编写真正的SQL。如果您有SQL2K5,可以使用Row_Number()来执行此操作。

答案 1 :(得分: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

答案 2 :(得分:0)

我已经决定每次从1开始都不需要它,所以我决定复制产品末尾的行ID列的意思。

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]))