2013-06-01 12 views
32

Mam zapytanie INSERT INTO SELECT. W instrukcji SELECT mam podzapytanie, w którym chcę dodać przyrostową liczbę w polu. To zapytanie będzie działać poprawnie, jeśli moje zapytanie SELECT i zwróci tylko jeden rekord, ale jeśli zwróci wiele wierszy, wstawi tę samą liczbę w polu przyrostowym dla wszystkich tych wierszy. Czy istnieje sposób, aby go ograniczyć, aby za każdym razem dodać przyrostowy numer?Dodawanie liczby inkrementalnej w polu w zapytaniu INSERT INTO SELECT w SQL Server

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

Odpowiedz

54

Możesz użyć do tego funkcji 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) 
          ) 

Jeżeli chcesz rozpocząć z maksimum już w tabeli, a następnie zrobić:

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

Wreszcie, można po prostu zrobić kolumnę sequence kolumna autoinkrementacja tożsamość. To oszczędza potrzebę zwiększania go za każdym razem:

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

dla trzeciej opcji nie trzeba wykonywać automatycznej inkrementacji pola sekwencji. Potrzebuję pobrać istniejącą liczbę z sekwencji i wstawić następną liczbę przyrostową w tej kolumnie –

+0

Scnerio 2 działa w moim stanie. bardzo dziękuję za natychmiastową pomoc. –

+0

:: jeśli moja kolumna squence nie zezwala na wartości null i moja tabela nie ma już żadnych rekordów. wyjątek wyrzucania .... –

Powiązane problemy