Sql server 如何用数字计数填充列?

Sql server 如何用数字计数填充列?,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,我正在转换为整数主键,在为新列数据设定整数计数种子时遇到问题 给定现有表格: create table t1 ( Id uniqueidentifier, NewId int, Data nvarchar(100) ) 如何使用结果集中从1到行数的数字计数更新现有行 因此: 将成为: |id |NewId |Data ---------------------------- |ABC |1 |first |DEF |2

我正在转换为整数主键,在为新列数据设定整数计数种子时遇到问题

给定现有表格:

create table t1 (
  Id uniqueidentifier, 
  NewId int,
  Data nvarchar(100)
)
如何使用结果集中从1到行数的数字计数更新现有行

因此:

将成为:

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

这是为了迁移到使用nhibernate的hilo主键,这是减少我的应用程序和数据库层之间的数据库往返所必需的,因此标识不是我的选项。

与其自己尝试这样做,为什么不将列添加为标识呢

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

这将为您解决问题。

与其自己尝试这样做,为什么不添加列作为标识呢

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

这将为您解决问题。

您可以使用诸如row_number:


您可以使用诸如row_number之类的窗口功能:


不确定它的效率有多高,但这是可行的-请参阅底部附近的update命令

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

不确定它的效率有多高,但这是可行的-请参阅底部附近的update命令

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

使用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

使用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

您可以使用一个变量,并为每一行更新一个变量

DECLARE @id INT 
SET @id = 0 

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

您可以使用一个变量,并为每一行更新一个变量

DECLARE @id INT 
SET @id = 0 

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


什么版本的SQL Server?序列是否重置过?SQL Server 2008。一旦填充了数据,我将使用不同的方法来管理主键。我只需要填充现有数据一次。SQL Server的哪个版本?序列是否重置过?SQL Server 2008。一旦填充了数据,我将使用不同的方法来管理主键。我只需要填充现有数据一次。原因是我不打算使用身份功能。相反,我将通过nhibernate使用hilo算法来避免数据库在插入时的往返。在这种情况下,使用行号的解决方案可能是最好的方法。您可以在更新数据后删除标识,所以这和Row_Number的功能完全一样,我以前也用过它,原因是我不打算使用IDENTITY功能。相反,我将通过nhibernate使用hilo算法来避免数据库在插入时的往返。在这种情况下,使用行号的解决方案可能是最好的方法。您可以在更新数据后删除标识,所以这个函数和Row_Number的函数完全一样,我以前也用过这个函数,我试过这个函数,它说我必须声明@t。示例中缺少了这个吗?@Michael:哎呀,@t应该是你的桌子。在answerI中编辑我尝试了这个,它说我必须声明@t。示例中缺少了这个吗?@Michael:哎呀,@t应该是你的桌子。在Answer中编辑此示例有效,耗时30秒。我接受的那个花了1秒,所以我把它标记为回答。谢谢你的帮助。游标真的应该是最后一个选择。这个例子很有效,花了30秒。我接受的那个花了1秒,所以我把它标记为回答。谢谢你的帮助。游标真的应该是最后的选择