2010-09-09 16 views
2

J'ajoute des lots d'enregistrements à une table à l'aide d'une seule instruction d'insertion. Je veux que chaque nouveau lot reçoive des numéros incrémentés, mais à partir de 1 à chaque fois.Enregistrements de mise à jour SQL avec une valeur d'incrémentation commençant à 1 à chaque fois

Donc, si je

Batch Name IncementingValue 
1  Joe  1 
1  Pete 2 
1  Andy 3 
2  Sue  1 
2  Mike 2 
2  Steve 3 

et je puis ajouter deux enregistrements (en utilisant une seule instruction d'insertion):

3  Dave 
3  Paul 

Comment puis-je exécuter une instruction de mise à jour contre cette table afin que Dave sera réglé sur 1 et Paul sur 2. Je ne veux pas utiliser de curseur.

+0

Quels SGBDR ciblez-vous? –

+0

J'utilise MS SQL 2005 – DEH

Répondre

2

La fonction de classement ROW_NUMBER devrait faire ce dont vous avez besoin. Vous n'avez pas parlé de règles spécifiques sur la façon dont le numéro de séquence doit être alloué, donc je l'ai fait ici en utilisant le nom:

INSERT targetTable(Batch,Name,IncementingValue) 
SELECT BatchId, 
     Name, 
     ROW_NUMBER() OVER (ORDER BY Name) 
FROM sourceTable 
+0

Super - merci. – DEH

+0

@Ed - savez-vous si je peux appliquer ces valeurs via une instruction de mise à jour, par ex. mise à jour SegmentationKeysUnconstrained set batchrownumber = row_number() plus (commande par trackingtokenid) de SegmentationKeysUnconstrained où batchid = '58D73880-31B1-40AF-A749-7F6EBEAAF3E4' – DEH

+0

Le problème que j'ai est que je dois répartir un ensemble de row_number () valeurs sur plusieurs instructions d'insertion, donc je ne peux pas réellement utiliser row_number au point d'insertion - Je dois le faire une fois que plusieurs insertions sont terminées. – DEH

0

je devais accomplir quelque chose de similaire avec des dates et des chiffres formatés.

Heureusement, quelqu'un trouvera cet exemple utile.

update TEST_TABLE 
    set ref = reference 
      from (
         select 
          *, 
          (CONVERT(VARCHAR(10),GETDATE(),12) + RIGHT('0000' + CAST(ROW_NUMBER() OVER (ORDER BY id) AS VARCHAR(4)), 4)) as reference 
         from TEST_TABLE 
         WHERE 
        test_table.id > 4 
         and 
        test_table.id < 8 
       ) TEST_TABLE