2010-11-15 8 views
0

Il existe une colonne 'Keys' dans une table. Avec des données Comme ceciGénération de valeurs uniques

Key Name 
1  aaa 
2  sads 
null asd 
null asd 

Maintenant, je dois remplacer les valeurs nulles par 3 et 4. Comment puis-je faire cela.

+0

Est-ce que toute la structure de la table? Pas de champs d'identité? Et vous voulez dupliquer 'Name's avec différents' Key's? – Oded

+1

à partir de l'exemple fourni, il n'est pas complètement spécifié comment vous souhaitez le faire. Quel est l'ordre dans lequel vous souhaitez affecter 3,4 ...? – Unreason

+0

oui Je souhaite des valeurs de clé différentes pour les mêmes noms. –

Répondre

2

Selon la version de SQL Server avec laquelle vous travaillez, vous utiliseriez TOP ou SET ROWCOUNT pour limiter une UPDATE à une seule ligne. Quelque chose comme ça va fonctionner:

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 

Mais ce n'est pas idéal. Je ne peux pas penser à une autre façon d'aborder les lignes en double - à moins qu'il s'agisse d'une tâche ponctuelle, auquel cas l'ajout temporaire d'une colonne IDENTITY fonctionnerait.

+0

Pouvez-vous s'il vous plaît expliquer cela. –

+1

@Nadeem - je ne sais pas quelles parties vous voulez expliquer. Si vous l'avez essayé et que cela n'a pas fonctionné, quel type d'erreur a été produit? Pour d'autres aspects, il serait préférable que vous ajoutiez plus d'informations à votre question. Quelle version de SQL utilisez-vous? Est-ce une tâche ponctuelle, ou allez-vous la gérer régulièrement? Si régulièrement, existe-t-il une raison pour laquelle les valeurs NULL ne peuvent pas être évitées en premier lieu. –

+0

+1 pour "ajouter une colonne d'identité", la bonne réponse et la bonne façon de le faire – smirkingman

0

Si vous pouvez mettre les données (temporairement) dans une table séparée, vous pouvez utiliser 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; 
Questions connexes