如何使用数字填充列?

时间:2010-03-10 16:59:51

标签: sql-server tsql sql-server-2008

我正在转换为整数主键,并且无法使用整数计数来接种新列数据。

给定现有表格:

create table t1 (
  Id uniqueidentifier, 
  NewId int,
  Data nvarchar(100)
)

如何使用从1到结果集中的行数的数字来更新现有行?

所以:

|id      |NewId       |Data
-------------------------------
|ABC     |null        |first
|DEF     |null        |second
|GHI     |null        |third

会变成:

|id      |NewId    |Data
----------------------------
|ABC     |1        |first
|DEF     |2        |second
|GHI     |3        |third

这是为了迁移到使用带有nhibernate的hilo主键,这是为了减少我的应用程序和数据库层之间的数据库往返,因此IDENTITY对我来说不是一个选项。

6 个答案:

答案 0 :(得分:4)

您可以使用像row_number这样的窗口函数:

update t
set NewId = sub.rn
from YourTable t
join (
    select
        id
    ,   row_number() over (order by id) as rn
    from YourTable
) sub on sub.id = t.id

答案 1 :(得分:2)

使用RowNumber(),它非常适合这样的事情:

;WITH SequencedData AS
(
  SELECT Id, ROW_NUMBER() OVER (ORDER BY Id) Sequence 
  FROM [YourTable]
)
UPDATE t
SET NewId = sd.Sequence
FROM [YourTable] t
JOIN SequencedData sd
  ON sd.Id = t.Id

答案 2 :(得分:2)

您可以使用变量并为每个要更新的行将其递增1。

DECLARE @id INT 
SET @id = 0 

UPDATE TableName 
SET @id = ColumnName = @id + 1

答案 3 :(得分:1)

不确定效率如何,但是这样做 - 请参阅底部附近的更新命令

create table t1 (Id uniqueidentifier, 
                 NewId int,
                 Data nvarchar(100))
create index idx_t1 on t1(data)

insert into t1 values (newid(), null, 'B')
insert into t1 values (newid(), null, 'A')
insert into t1 values (newid(), null, 'F')
insert into t1 values (newid(), null, 'C')
insert into t1 values (newid(), null, 'E')

update t1
   set [newid]=(select count(*) from t1 as temp where temp.data <= t12.data)
from t1 as t12

select * from t1

答案 4 :(得分:1)

DECLARE @Id INT
DECLARE @CurrentRow INT
SET @CurrentRow = 1

DECLARE SetIDCursor INSENSITIVE CURSOR FOR  
    SELECT  Id
    FROM t1
    ORDER BY Id
    FOR READ ONLY

OPEN SetIDCursor

WHILE (0=0)
   BEGIN
    FETCH NEXT FROM SetIDCursor
    INTO    @Id

    IF (@@FETCH_STATUS <> 0) BREAK

    UPDATE t1
    SET NewID = @CurrentRow
    WHERE Id = @Id

    SET @CurrentRow = @CurrentRow + 1
   END

CLOSE SetIDCursor
DEALLOCATE SetIDCursor

答案 5 :(得分:0)

不要自己尝试这样做,为什么不将列添加为标识。

ALTER TABLE YourTable
    ADD NewId INT IDENTITY(1,1)

这会照顾你。