2010-11-15 148 views
0

表中有一列'Keys'。有数据像这样生成唯一值

Key Name 
1  aaa 
2  sads 
null asd 
null asd 

现在我需要用3和4替换空值。我该怎么做。

+0

是表的整体结构?没有身份字段?你想重复'名称'与不同的'钥匙'? – Oded 2010-11-15 10:22:41

+1

从所提供的示例中,并未完全指定您希望如何执行此操作。你想指定3,4的顺序是什么? – Unreason 2010-11-15 10:23:38

+0

是的我想要不同的键值为相同的名称。 – 2010-11-15 10:24:24

回答

2

根据您使用的SQL Server版本,您可以使用TOP或SET ROWCOUNT将UPDATE限制为单行。像这样的东西将工作:

select top 1 * from sysobjects 
WHILE @@ROWCOUNT > 0 
BEGIN 
    UPDATE TOP 1 Keys SET Key = (SELECT MAX(Key) from Keys)+1 WHERE Key is null 
END 

但是不理想。我想不出另一种处理重复行的方法 - 除非这是一次性任务,在这种情况下,临时添加一个IDENTITY列将会起作用。

+0

你能解释一下吗? – 2010-11-15 10:39:11

+1

@Nadeem - 不确定你想要解释哪个部分。如果您尝试了它并且无法正常工作,那么会产生什么类型的错误?对于其他方面,如果您在问题中添加了更多信息,则会更好。你使用的是什么版本的SQL?这是一次性任务,还是定期运行?如果定期,是否有一个原因,为什么无法预防NULL摆在首位。 – 2010-11-15 10:50:33

+0

+1为“添加标识列”,正确的答案和正确的方法 – smirkingman 2010-11-15 11:07:20

0

如果你可以把数据(暂时)到一个单独的表,你可以使用ROW_COUNT():

declare @Keys table ([Key] int not null, [Name] varchar(50) null); 

insert into @Keys ([Key], [Name]) 
select [Key], [Name] 
from [Keys] 
where [Key] is not null 
union all 
select [Key] = row_number() over (order by [Name]) + 
       (select max([Key]) from [Keys]), 
     [Name] 
from [Keys] 
where [Key] is null; 

truncate table [Keys]; 
insert into [Keys] select * from @Keys;