我正在转换为整数主键,并且无法使用整数计数来接种新列数据。
给定现有表格:
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对我来说不是一个选项。
答案 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)
这会照顾你。