Подтвердить что ты не робот

Добавить инкрементный номер в поле в запросе INSERT INTO SELECT в SQL Server

У меня есть запрос INSERT INTO SELECT. В инструкции SELECT у меня есть подзапрос, в котором я хочу добавить инкрементное число в поле. Этот запрос будет работать нормально, если мой запрос SELECT и возвращает только одну запись. Но если он возвращает несколько строк, он вставляет одинаковое число в поэтапное поле для всех этих строк. Есть ли способ ограничить его добавлением инкрементного числа каждый раз?

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 
          [email protected])
FROM 
    PM_Ingrediants 
WHERE 
    PM_Ingrediants.ID IN (SELECT 
                              ID 
                          FROM 
                              GetIDsTableFromIDsList(@IngrediantsIDs))
)
4b9b3361

Ответ 1

Для этого вы можете использовать функцию row_number().

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)
                             )

Если вы хотите начать с максимума уже в таблице, выполните следующие действия:

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)
                             )

Наконец, вы можете просто сделать столбец sequence автоинкрементным столбцом идентификации. Это избавляет от необходимости увеличивать его каждый раз:

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