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