2013-06-01 6 views
32

Ich habe eine INSERT INTO SELECT Abfrage. In der SELECT Anweisung habe ich eine Unterabfrage, in der ich eine inkrementelle Zahl in einem Feld hinzufügen möchte. Diese Abfrage funktioniert gut, wenn meine SELECT Abfrage und nur einen Datensatz zurückgibt, aber wenn es mehrere Zeilen zurückgibt, fügt es die gleiche Zahl in das inkrementelle Feld für alle diese Zeilen ein. Gibt es eine Möglichkeit, es zu beschränken, jedes Mal eine inkrementelle Nummer hinzuzufügen?Fügen Sie eine inkrementelle Zahl in einem Feld in INSERT INTO SELECT-Abfrage in 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)) 
) 

Antwort

54

Sie können hierfür die Funktion row_number() verwenden.

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

Wenn Sie mit dem Maximum bereits in der Tabelle beginnen dann tun:

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

Schließlich können Sie einfach die sequence Spalt eine automatische Erhöhung Identitätsspalt machen. Dies erspart die Notwendigkeit, es jedes Mal zu erhöhen:

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

für die dritte Option Ich muss Sequenz Sequenz Auto Inkrement nicht machen. Ich muss die vorhandene Nummer aus der Sequenz abrufen und die nächste inkrementelle Nummer in dieser Spalte einfügen. –

+0

Scnerio 2 funktioniert in meinem Zustand. Vielen Dank für die sofortige Hilfe. –

+0

:: wenn meine Sequenz-Spalte keine Null-Werte zulässt und meine Tabelle keinen Datensatz hat. seine Wurfausnahme .... –