2016-04-28 8 views
1

Ich brauche eine Methode zur Verwaltung von Sequenzen in einer Tabelle. Ich habe eine Tabelle, die von einer Sequenz verwaltet werden muss. Ich muss in der Lage sein, eine Zeile zwischen zwei anderen Zeilen einzufügen. wenn ich eine nummerierte Sequenz von 1 bis 10000 habe, und ich möchte eine Zeile zwischen 100 und 101 einfügen. Oder ich möchte 99 zwischen 1 und 2 verschieben.MSSQL steuernde Sequenz

Kann dies in SQL verwaltet werden oder brauche ich um es programmgesteuert zu verwalten.

Antwort

1

SQL Server-Tabellen haben keine implizite Reihenfolge!

Die einzige Möglichkeit zum Erzwingen einer Sequenz ist eine sortierbare Spalte (oder eine Kombination von Spalten) mit eindeutigen Werten.

Eine Möglichkeit, dies zu erreichen, war Ihre Reihe nach ein nummerieren bestehenden Sortierschlüssel:

  • eine Spalte SortKey BIGINT hinzufügen (nachdem es mit Werten füllen Sie es NOT NULL setzen soll und erstellen Sie eine unique index)

werden Sie diese voll funktionsfähiges Beispiel zeigen, wie dies zu tun:

CREATE TABLE #Dummy(SomeExistingSortField INT, SomeContent VARCHAR(100)); 
INSERT INTO #Dummy VALUES(3,'insert first'),(1,'insert second'),(2,'insert third'); 

SELECT * FROM #Dummy; 

ALTER TABLE #Dummy ADD SortKey BIGINT; 

WITH CTE AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT SomeExistingSortField)) * 10 AS nr 
      ,SortKey 
    FROM #Dummy 
) 
UPDATE CTE SET SortKey=nr; 

SELECT * FROM #Dummy ORDER BY SortKey; 

INSERT INTO #Dummy VALUES(99,'between 1 and 2',15); 

SELECT * FROM #Dummy ORDER BY SortKey; 

WITH CTE AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT SortKey)) * 10 AS nr 
      ,SortKey 
    FROM #Dummy 
) 
UPDATE CTE SET SortKey=nr; 

SELECT * FROM #Dummy ORDER BY SortKey; 

GO 
DROP TABLE #Dummy; 
+0

@ user625079, sorry, du hast recht, ich war mit dieser schnell ... Ich werde meine Antwort in wenigen Minuten bearbeiten ... – Shnugo

+0

Ich habe versucht, diese SELECT Q.RowNumber FROM ( SELECT ROW_NUMBER() OVER (ORDER BY [oldkey]) * 10 AS Zeilennummer FROM Mytable ) AS Q ORDER BY RowNumber und OK. Aber wenn ich i aktualisieren es fügt nur 10 bei jedem neuen seqkey – user625079

+0

Dieses Update bringt 10 in allen seqkey UPDATE mytable SET SeqKey = Q.RowNumber FROM ( SELECT ROW_NUMBER() OVER (ORDER BY OLDKEY) * 10 AS RowNumber FROM mytable ) AS Q – user625079

0

SQL speichert keine Daten in einer bestimmten Reihenfolge in der Tabelle, es erscheint nur so, wenn Sie Daten mit einem Index oder einer anderen Abfrage betrachten. Sie müssten über eine ID-Spalte verfügen, mit der Sie die Daten sortieren können. Es wird nicht einfach sein, Daten zwischen zwei aktuellen Zeilen einzufügen (z. B. um zwischen 100 und 101 einzufügen, müssten Sie alles neu nummerieren 101 <).

0

Ein Weg, um ein köstliches Das wäre, wenn Ihre Sequenz nicht zusammenhängend wäre. Das heißt, geben Sie ein Inkrement für die Sequenz an, um genügend Lücken zu lassen, um Ihre Interleaving-Zeilen einzufügen. Natürlich ist das nicht perfekt, da Sie Ihre Lücke zwischen den Reihen ausschöpfen können, aber es ist ein Anfang.