SQL Server: динамическое обновление RowNumber таблицы - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь обновить все строки моей базы данных с помощью RowNumber ...

В моем цикле, проходящем через мои таблицы, я получил два динамических оператора:

Set @SqlStringOne = ('
            Alter Table ' +@Schema+'.'+@Table+'
            Add RowID int;
            ')
    Exec(@SqlStringOne); 

(isработает и добавляет новый столбец RowID (RowNum) в мою таблицу) и

Set @SqlStringTwo = ('
            update ' +@Schema+'.'+@Table+'
            Set  x.RowID = x.RowID_x
            from
            (select 
             RowID,
             ROW_NUMBER() OVER 
            (ORDER BY (Select TOP 1 COLUMN_NAME from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '+@Table+')) as RowID_x
            from '+@Schema+'.'+@Table+') x
            ');
    Exec dbo.sp_executesql @stmt = @SqlStringTwo

Но обновление не работает ...

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я не понимаю order by.Почему бы просто не сделать это?

update x
    set x.RowID = x.RowID_x
    from (select  t.*,
                  row_number() over (order by (select null)) as rowid_x
          from ' + @Schema + '.' + @Table + '
         ) x;

Вы можете использовать x в update.Я не понимаю ссылку на системную таблицу для order by.Он должен возвращать константу, поэтому вы можете использовать (select null).

0 голосов
/ 26 февраля 2019

У вас есть две проблемы в вашем запросе.

1- Если вы хотите обновить с помощью FROM, вам нужно использовать псевдоним.

2- в вашем заказе, вам нужно пройтиИмя таблицы в виде строки.

Измените свой запрос следующим образом.

Set @SqlStringTwo = ('
            update x 
            Set  x.RowID = x.RowID_x
            from
            (select 
             RowID,
             ROW_NUMBER() OVER 
            (ORDER BY (Select TOP 1 COLUMN_NAME from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '''+@Table+''')) as RowID_x
            from '+@Schema+'.'+@Table+') x
            ');
    Exec dbo.sp_executesql @stmt = @SqlStringTwo

Вы всегда можете распечатать SQL-запрос, чтобы проверить наличие проблем.

...