SQL Server:动态更新表的行号

时间:2019-02-26 11:04:08

标签: sql dynamic rownum

我正在尝试使用RowNumber更新数据库的所有行...

在遍历表的循环中,我得到了以下两个动态语句:

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

(正在工作并将新的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 :(得分:0)

查询中有两个问题。

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查询以检查是否存在任何问题。

答案 1 :(得分:0)

我不了解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)