2010-11-15 182 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;