Как заполнить столбец с количеством чисел? - PullRequest
1 голос
/ 10 марта 2010

Я преобразовываю в целочисленный первичный ключ, и у меня возникают проблемы с заполнением новых данных столбца с количеством целых чисел.

Учитывая существующую таблицу:

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

Это для перехода к использованию первичного ключа hilo с nhibernate, который необходим для сокращения количества обращений к базе данных между уровнями моего приложения и базы данных, поэтому IDENTITY для меня не вариант.

Ответы [ 6 ]

4 голосов
/ 10 марта 2010

Вы можете использовать функцию управления окнами, например 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
2 голосов
/ 31 июля 2017

Вы можете использовать переменную и увеличивать ее на 1 для каждой обновляемой строки.

DECLARE @id INT 
SET @id = 0 

UPDATE TableName 
SET @id = ColumnName = @id + 1
2 голосов
/ 10 марта 2010

Используйте 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
1 голос
/ 10 марта 2010
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
1 голос
/ 10 марта 2010

не уверен, насколько это эффективно, но это работает - смотрите команду обновления внизу

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
0 голосов
/ 10 марта 2010

Вместо того, чтобы пытаться сделать это самостоятельно, почему бы просто не добавить столбец в качестве идентификатора.

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

Это позаботится об этом за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...