Inkrementierten Sequenznummer, die auf SQL einfügen

Gibt es eine einfache Möglichkeit, um mehrere Zeilen einfügen und die Schrittweite ein bestimmtes Feld, SQL Server 2005 verwenden?

Hinweis, ich bin nicht auf der Suche nach einer Lösung, die eine identity Spalte - siehe unten die Frage nach einer Erklärung für die

(Das folgende schema und die Daten repliziert worden sind,hier in diesem SQLFiddle.)

Betrachten Sie beispielsweise die folgende Tabelle und die Daten...

CREATE TABLE #TEMPTABLE (
   [PKID] INT IDENTITY, [FKID] INT, [MYTEXT] VARCHAR(10), [SEQUENCE] INT
)
INSERT INTO #TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE]) VALUES (1, 'one', 1)
INSERT INTO #TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE]) VALUES (1, 'two', 2)

-- Table data
PKID  FKID  MYTEXT  SEQUENCE
1     1     one     1
2     1     two     2

Und die folgenden Daten an, die eingefügt werden...

DECLARE @FKID INT
SET @FKID = 1
DECLARE @NEWDATA XML
SET @NEWDATA = '<data><text>three</text><text>four</text></data>'

Können die folgenden geschrieben werden, so dass die SEQUENCE Feld kommt als 1,2,3,4 statt der 1,2,3,3 aktuell?

INSERT INTO #TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE])
SELECT @FKID, 
       X.value('.','VARCHAR(10)'),
       (SELECT ISNULL(MAX([SEQUENCE]),0)+1 FROM #TEMPTABLE WHERE [FKID]=@FKID)
FROM @NEWDATA.nodes('/data/text') AS X(X)

-- Actual result...
PKID  FKID  MYTEXT  SEQUENCE
1     1     one     1
2     1     two     2
3     1     three   3
4     1     four    3  <-- Issue

-- Required result...
PKID  FKID  MYTEXT  SEQUENCE
1     1     one     1
2     1     two     2
3     1     three   3
4     1     four    4

Update:

Antwort auf den Kommentar von @marc_s...

Identität wäre die beste Lösung für 2005... beste Lösung durch weit - warum tun Sie explizit ausschließen und bestehen auf Ihre eigenen Rollen? (mit all den Risiken verursachen Duplikate, und so weiter....)

Der Tabelle zu Frage halten wird, mehrere sets von SEQUENCE Werte, jedes "set" auf der Grundlage der FKID Wert... also der Tabelle halten konnte Daten entlang dieser Linien...

PKID  FKID  MYTEXT  SEQUENCE
1     1     one     1
2     1     two     2
3     1     three   3
4     1     four    4
5     2     ett     1
6     2     tva     2
7     2     tre     3
Ich glaube, eine einfache Möglichkeit, dies zu tun erfordert die SQL Server 2012.
Ja, @Pieter, ich bin mir sicher, es wäre einfacher - leider bin ich stecken mit 2005, als das ist das minimum unterstützt, DB und viele unserer Kunden sind immer noch mit es
Weil, @marc_s, die Sequenz wird direkt mit der foreign key-Spalte. I. e. FKID=1 können mehrere Zeilen mit SEQUENCE=1,2,3 und FKID=2 können auch SEQUENCE=1,2. Sorry, wenn ich das nicht machen, klar in der OP
irgendeinem Grund Sie nicht verwenden können, eine variable, es zu tun? Erklären, und die Schrittweite, um Sie von Ihrer select-Anweisung? Schreiben Sie die variable am Ende.
Sorry @Random, verstehe ich nicht so würden Sie eine variable verwenden... bitte fühlen Sie sich frei, um eine Antwort mit Lösung

InformationsquelleAutor freefaller | 2013-03-20

Schreibe einen Kommentar