2016-06-20 16 views
0

Ich verfüge über eine Benutzeroberfläche, mit der ein Benutzer ein oder mehrere Felder auswählen kann, die er einer Tabelle hinzufügen möchte. Mit diesen Daten ist auch eine orderID verknüpft, die die Halbbildreihenfolge bestimmt.TSQL Inkrementieren der Anzahl der Variablen

Wenn der Benutzer neue Felder hinzufügt, muss ich den letzten orderID suchen, den dieser Benutzer verwendet, und ihn um 1 erhöhen, wobei alle neuen Felder gesendet werden.

Zum Beispiel, wenn es einen einzigen Datensatz gibt, der bereits in der Datenbank existiert, würde es eine orderID von 1 haben. Wenn ich drei weitere Felder hinzufügen möchte, würde es die letzte orderID anzeigen, die ich verwendet habe (1) und dann für jeden der neuen hinzugefügten Datensätze, 1-4, inkrementieren.

-- Get the last ID orderID for this user and increment it by 1 as our starting point 
DECLARE @lastID INT = (SELECT TOP 1 orderID FROM dbo.BS_ContentRequests_Tasks_User_Fields WHERE QID = @QID ORDER BY orderID DESC) 
SET @lastID = @lastID+1; 

-- Create a temp table to hold our fields that we are adding 
DECLARE @temp AS TABLE (fieldID int, orderID int) 

-- Insert our fields and incremented numbers 
INSERT INTO @temp(fieldID, orderID) 
SELECT ParamValues.x1.value('selected[1]', 'int'), 
     @lastID++ 
FROM @xml.nodes('/root/data/fields/field') AS ParamValues(x1); 

Offensichtlich ist der @lastID++ Teil ist, wo mein Problem ist, aber hoffentlich hilft es, zu verstehen, was ich zu tun versuchen.

Welche andere Methode könnte dazu verwendet werden?

Antwort

1

ROW_NUMBER() sollte es tun.

select x.Value, 
     ROW_NUMBER() over (order by x.Value) + @lastID 
    from (
     select 10 ParamValues.x1.value('selected[1]', 'int') Value 
      from @xml.nodes('/root/data/fields/field') AS ParamValues(x1) 
     ) x 
+0

ich diesen Fehler bekam - 'Msg 5308, Ebene 16, Status 1, Prozedur BS_Update_ContentRequests_AvailableFields, Linie 43 Windowed Funktionen und NEXT VALUE FOR-Funktionen keine ganzzahligen Indizes wie ORDER BY-Klausel expressions.' – SBB

+0

Hmm unterstützen. Ich habe es aktualisiert, um den Wert selbst in der Reihenfolge nach Klausel zu verwenden ... dachte nicht, dass es notwendig war, aber ich denke, es war. –

+0

Das hat gut funktioniert :) - Danke für die Hilfe! – SBB

0

Sie können eine Spalte mit IDENTITY verwenden (1,1)

0

Wenn Sie OrderID wollen über die gesamte Tabelle eindeutig sein dann unten:

Klicken Sie here einen Blick zu nehmen in einem anderen Beitrag, der dieses Problem angeht.

Es gibt mehrere Möglichkeiten, dieses Problem anzugehen, aber in diesem Fall ist das einfachste, wenn auch vernünftige Mittel die Verwendung einer Identitätsspalte. Dies ist jedoch nicht so erweiterbar wie die Verwendung einer Sequenz. Wenn Sie der Meinung sind, dass Sie in Zukunft möglicherweise mehr Flexibilität benötigen, verwenden Sie eine Sequenz.

Wenn Sie OrderID wollen einzigartig sein unten über die Felder in einer Charge eingeführt dann sehen:

Sie sollten einen genaueren Blick auf Chris Steele Antwort nehmen.

Verwandte Themen