Sql server SQL Server:如何为行范围更新列?

Sql server SQL Server:如何为行范围更新列?,sql-server,Sql Server,工作环境是SQLServer2000。我有一个没有索引的表,没有PK。。。总行数为600000 如何用一个值更新第0->100000行中的列,然后用另一个值更新第100001->200000行中的列,依此类推 谢谢。您可能想到了以前,在IBM的VSAM数据文件中的SQL-DS中,您可以在物理文件中获取相对记录号 不幸的是,或者说幸运的是,这已经成为历史。您可能想到了过去,在IBM的VSAM数据文件中的SQL-DS中,您能够在物理文件中获得相对记录编号 不幸的是,或者说幸运的是,这是历史。将所有值

工作环境是SQLServer2000。我有一个没有索引的表,没有PK。。。总行数为600000

如何用一个值更新第0->100000行中的列,然后用另一个值更新第100001->200000行中的列,依此类推


谢谢。

您可能想到了以前,在IBM的VSAM数据文件中的SQL-DS中,您可以在物理文件中获取相对记录号


不幸的是,或者说幸运的是,这已经成为历史。

您可能想到了过去,在IBM的VSAM数据文件中的SQL-DS中,您能够在物理文件中获得相对记录编号


不幸的是,或者说幸运的是,这是历史。

将所有值设置为null,然后将行数设置为100000。然后进行连续更新,每个更新都会影响100000行,其中该列为空@@rowcount是每次更新后受影响的行数,因此在小于100000时停止

对于@Shannon的评论,在SQL Server 2008之后的SQL Server下一版本中,update/delete/insert语句将不支持行数,但它在SQL Server 2000中可以正常工作。建议的更改是使用TOP子句,但我认为在SQLServer2005之前,更新不支持TOP子句

我想你可以起诉一个游标如果你想

update mytable set myid = null

SET NOCOUNT ON -- prevent all those "1 row(s) updated" messages
declare @count int, @value int, @myid int
set @count = 1
set @value = 1
declare cursor_update cursor for select myid from mytable
open cursor_update
fetch cursor_update into @myid
while @@FETCH_STATUS = 0
begin
    update mytable set myid = @value where current of cursor_update

    set @count = @count + 1
    if (@count > 100000) 
    begin
        set @count = 1
        set @value = @value + 1
    end

    fetch cursor_update into @myid
end
close cursor_update
deallocate cursor_update

将所有值设置为null,然后将行数设置为100000。然后进行连续更新,每个更新都会影响100000行,其中该列为空@@rowcount是每次更新后受影响的行数,因此在小于100000时停止

对于@Shannon的评论,在SQL Server 2008之后的SQL Server下一版本中,update/delete/insert语句将不支持行数,但它在SQL Server 2000中可以正常工作。建议的更改是使用TOP子句,但我认为在SQLServer2005之前,更新不支持TOP子句

我想你可以起诉一个游标如果你想

update mytable set myid = null

SET NOCOUNT ON -- prevent all those "1 row(s) updated" messages
declare @count int, @value int, @myid int
set @count = 1
set @value = 1
declare cursor_update cursor for select myid from mytable
open cursor_update
fetch cursor_update into @myid
while @@FETCH_STATUS = 0
begin
    update mytable set myid = @value where current of cursor_update

    set @count = @count + 1
    if (@count > 100000) 
    begin
        set @count = 1
        set @value = @value + 1
    end

    fetch cursor_update into @myid
end
close cursor_update
deallocate cursor_update

在SQL Server 2005+中,您可以使用排名根据任意或特定顺序分配相对行号:

WITH ranked AS (
  SELECT
    *,
    rn = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
  FROM table
)
UPDATE ranked
SET column = CASE
  WHEN rn BETWEEN      1 AND 100000 THEN value1
  WHEN rn BETWEEN 100001 AND 200000 THEN value2
  …
END

将“选择1”替换为列列表以使用特定顺序。

在SQL Server 2005+中,您可以使用排名根据任意或特定顺序分配相对行号:

WITH ranked AS (
  SELECT
    *,
    rn = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
  FROM table
)
UPDATE ranked
SET column = CASE
  WHEN rn BETWEEN      1 AND 100000 THEN value1
  WHEN rn BETWEEN 100001 AND 200000 THEN value2
  …
END

用列列表替换SELECT 1以使用特定的顺序。

注意:我相信这在SQL Server 2000上是可行的,但没有该版本可供测试

要更改不确定的行集,请使用如下顶部查询:

drop table t

create table t (c varchar(20))

insert into t
select top 15 'unchanged' from information_schema.columns

update alias
set c = 'changed'
from (select top 5 * from t) alias

-- note later queries need to be able to look at data
-- to tell if the row has already been processed.
update alias
set c = 'another change'
from (select top 5 * from t where c = 'unchanged') alias

select * from t

注意:我相信这可以在SQLServer2000上运行,但没有那个版本可供测试

要更改不确定的行集,请使用如下顶部查询:

drop table t

create table t (c varchar(20))

insert into t
select top 15 'unchanged' from information_schema.columns

update alias
set c = 'changed'
from (select top 5 * from t) alias

-- note later queries need to be able to look at data
-- to tell if the row has already been processed.
update alias
set c = 'another change'
from (select top 5 * from t where c = 'unchanged') alias

select * from t

在这两行之间可以工作,不是吗?如何对行进行排序以标识行0->100000、100001->200000等等?如果没有唯一键,如何标识行?我的意思是,如果第21000行=第515000行,您不能以指定的方式更新它。如果您不能识别一行,您就没有订单。如果没有订单,就没有行的范围。实际上,我需要这个更新来进行测试。我任意选择了更新超过一定行数的列。在这两者之间可以工作,不是吗?如何对行进行排序以标识行0->100000、100001->200000等等?如果没有唯一键,如何标识行?我的意思是,如果第21000行=第515000行,您不能以指定的方式更新它。如果您不能识别一行,您就没有订单。如果没有订单,就没有行的范围。实际上,我需要这个更新来进行测试。我已任意选择更新超过一定行数的列。不建议在新开发中使用set rowcount。在SQL Server 2000上进行测试时,可能没有问题。请参阅“设置行数时突出显示的警告”不建议用于新开发。在SQL Server 2000上进行测试时,可能没有问题。请参阅中突出显示的警告