2016-11-03 2 views
0

Ich habe ein etwas hässliches Problem der Umgang mit einer vorhandenen Datenbank. Diese Datenbank eine Transaction_Items Tabelle hat, die die Positionen für jede Transaktion enthält (vereinfacht):"Einfügen" neue Zeile mit der niedrigsten Identität in SQL Server

Transaction_Item_ID(Identity - Auto) Transaction_ID Item_Name 
----------------------------------------------------------------- 
1          12345   Service1 
2          12345   Service2 
3          12345   Service3 
4          12346   Service1 

Diese Transaktionen zeigen auf einer Rechnung und die Anwendung immer Aufträge sie auf dieser Rechnung auf der Grundlage der Transaction_Item_ID.

Ich muss einen Service-Artikel zu bestimmten Transaktionen hinzufügen, die immer zuerst erscheinen, nennen wir den Artikel MEMO Name. Andernfalls müssen die Elemente in der gleichen Reihenfolge bleiben. Daher muss dieser MEMO Artikel immer den niedrigsten Transaction_Item_ID von denen haben, die der Transaktion entsprechen. Weil Transaction_Item_ID eine Autoidentitätsspalte ist, kann ich das nicht einfach auf einen niedrigeren Wert ändern. Ich denke, ich muss im Grunde die Item_name der ersten Zeile auf MEMO aktualisieren, während Sie den vorhandenen Elementnamen in die nächstniedrigere Zeile usw. kopieren, bis der vorherige letzte Zeilenwert in eine neue Zeile eingefügt wird.

Die Frage ist, wie man das macht oder ob es einen besseren Weg gibt, das gleiche Ergebnis zu erzielen.

im Grunde wie folgt endet:

Transaction_Item_ID(Identity - Auto) Transaction_ID Item_Name 
----------------------------------------------------------------- 
1          12345   MEMO 
2          12345   Service1 
3          12345   Service2 
4          12346   Service1 
5          12345   Service3 

EDIT Zur Klarstellung: Ich habe keinen Zugriff auf die Anwendung zu ändern, die sonst in dieser Tabelle verwendet. Ich kann der Tabelle keine neue Spalte hinzufügen.

Ich weiß, dass der Identity-Wert nicht geändert werden kann/sollte, da dies eine Unordnung verursachen würde. Deshalb nehme ich an, dass die einzige Antwort darin besteht, den Wert des Elementnamens "nach unten" in die Zeilen zu verschieben.

Ja, das ist hässlich und alles andere als ideal. Leider ist es in vielen Unternehmen Realität, mit Legacy-Anwendungen umzugehen und das Beste daraus zu machen. Zumindest habe ich tatsächlich Lese-/Schreibzugriff auf die Datenbank.

+4

Dies ist nicht wirklich etwas, was getan werden sollte, IMO. Sie sollten die Abfrage, die Daten aus der Tabelle extrahiert, wirklich ändern, um eine benutzerdefinierte Reihenfolge nach Anweisung zu erhalten. z.B. 'order by case wenn item_name = 'memo' dann 0 else 1 end, transaction_item_id' – ZLK

+0

Warum fügst du das nicht mit einem Wert von -1 für die' transaction_item_id' ein? –

+0

Sie können ** keinen vorhandenen Wert in einer Identitätsspalte aktualisieren. SQL Server ermöglicht Ihnen das Einfügen ** bestimmter benutzerdefinierter Werte mit dem Befehl SET IDENTITY_INSERT ON, aber Sie können ** nie ** ein Update durchführen vorhandener Wert der Spalte "identity". –

Antwort

1

Ich mag Ihre Idee nicht, jede Zeile zu aktualisieren.

Die einfachste Lösung in diesem Szenario besteht darin, diese Tabelle umzubenennen und als Staging-Tabelle zu verwenden und anschließend eine Einfügung in eine neue Tabelle (mit dem Namen Ihrer ursprünglichen Tabelle) mit der gewünschten Reihenfolge durchzuführen.

Oder ändern Sie die Reihenfolge in der Anwendung.

+0

Danke, aber sehe meine Bearbeitung. Ich habe keinen Zugriff, um die Anwendung zu ändern oder die Tabelle zu ändern. Die Freuden alter Software von toten Firmen. – Thildemar

+0

Welche DB-Rechte haben Sie dann?Überprüfen Sie Ihre Benutzer-/AD-Anmeldung in der DB (In SSMS: Gehen Sie in den Ordner db, in dem die Daten gespeichert sind -> Sicherheit -> Benutzer -> Rechtsklick auf Ihre Login-/AD-Gruppe -> Eigenschaften -> Mitgliedschaft) – TJB

+0

Kein Rechteproblem diese Datenbank. Das Problem ist, dass ich die Anwendung, die auf diese Daten zugreift, nicht ändern kann, was bedeutet, dass Datenbankänderungen es wahrscheinlich abwerfen. Wenn ich umbenenne und ersetze, wie Sie es empfehlen, gibt es wahrscheinlich Probleme, da die Anwendung weiterhin versucht, auf diese Tabelle zuzugreifen und neue Zeilen zu schreiben. – Thildemar

Verwandte Themen