web-dev-qa-db-fra.com

Ajouter un numéro incrémentiel dans un champ de la requête INSERT INTO SELECT dans SQL Server

J'ai un INSERT INTO SELECT requête. Dans l'instruction SELECT, j'ai une sous-requête dans laquelle je veux ajouter un nombre incrémentiel dans un champ. Cette requête fonctionnera correctement si ma requête SELECT ne renvoie qu'un seul enregistrement. Toutefois, si elle renvoie plusieurs lignes, elle insère le même nombre dans le champ incrémentiel de toutes ces lignes. Y a-t-il un moyen de le restreindre pour ajouter un nombre incrémental à chaque fois?

INSERT INTO PM_Ingrediants_Arrangements_Temp 
(AdminID,ArrangementID,IngrediantID,Sequence)
(SELECT 
     @AdminID, @ArrangementID, PM_Ingrediants.ID, 
     (SELECT 
          MAX(ISNULL(sequence,0)) + 1 
      FROM
          PM_Ingrediants_Arrangements_Temp 
      WHERE 
          ArrangementID=@ArrangementID)
FROM 
    PM_Ingrediants 
WHERE 
    PM_Ingrediants.ID IN (SELECT 
                              ID 
                          FROM 
                              GetIDsTableFromIDsList(@IngrediantsIDs))
)
37
Sohail Hameed

Vous pouvez utiliser la fonction row_number() pour cela.

INSERT INTO PM_Ingrediants_Arrangements_Temp(AdminID, ArrangementID, IngrediantID, Sequence)
    SELECT @AdminID, @ArrangementID, PM_Ingrediants.ID,
            row_number() over (order by (select NULL))
    FROM PM_Ingrediants 
    WHERE PM_Ingrediants.ID IN (SELECT ID FROM GetIDsTableFromIDsList(@IngrediantsIDs)
                             )

Si vous voulez commencer avec le maximum déjà dans la table, alors faites:

INSERT INTO PM_Ingrediants_Arrangements_Temp(AdminID, ArrangementID, IngrediantID, Sequence)
    SELECT @AdminID, @ArrangementID, PM_Ingrediants.ID,
           coalesce(const.maxs, 0) + row_number() over (order by (select NULL))
    FROM PM_Ingrediants cross join
         (select max(sequence) as maxs from PM_Ingrediants_Arrangement_Temp) const
    WHERE PM_Ingrediants.ID IN (SELECT ID FROM GetIDsTableFromIDsList(@IngrediantsIDs)
                             )

Enfin, vous pouvez simplement transformer la colonne sequence en une colonne d’identité auto-incrémentée. Cela évite d'avoir à l'incrémenter à chaque fois:

create table PM_Ingrediants_Arrangement_Temp ( . . .
    sequence int identity(1, 1) -- and might consider making this a primary key too
    . . .
)
67
Gordon Linoff