Ist es möglich, in SQL Server eine Funktion zu erstellen, die eine Sequenz umgehen konnte?

StackOverflow https://stackoverflow.com/questions/324178

Frage

Wir sind an verschiedenen Optionen suchen unsere Persistenz-Schicht aus Oracle in einer anderen Datenbank und einer Portierung, die wir betrachten ist MS SQL. Allerdings verwenden wir Oracle-Sequenzen über den gesamten Code und aus diesem Grund scheint es, Bewegungs wird ein Kopfschmerz sein. Ich verstehe, über @identity aber das wäre eine massive Überarbeitung des Persistenz-Code sein.

Ist es in SQL Server möglich, eine Funktion zu erstellen, die eine Sequenz umgehen konnte?

War es hilfreich?

Lösung

Das hängt von Ihrer aktuellen Verwendung von Sequenzen in Oracle. Typischerweise wird eine Sequenz in dem Insert-Trigger gelesen wird.

Aus Ihrer Frage denke ich, dass es die Persistenz-Schicht ist, der die Sequenz erzeugt, bevor sie in die Datenbank einfügen (einschließlich des neuen Stück)

In MSSQL können Sie SQL-Anweisungen mit kombinieren ‚;‘, so die Identitätsspalte des neu erstellten Datensatz abzurufen, verwenden Sie INSERT INTO ...; SELECT SCOPE_IDENTITY ()

Damit der Befehl, um einen Datensatz eine Datensatzgruppe mit einer einzigen Zeile und einer einzigen Spalte gibt den Wert der Identitätsspalte enthält.

Sie können diesen Ansatz um natürlich drehen und Sequence-Tabellen (ähnlich die Dual-Tabelle in Oracle), in etwa wie folgt erstellen:

INSERT INTO SequenceTable (dummy) VALUES ('X');
SELECT @ID = SCOPE_IDENTITY();
INSERT INTO RealTable (ID, datacolumns) VALUES (@ID, @data1, @data2, ...)

Andere Tipps

Ich habe das im vergangenen Jahr an einem Projekt. Im Grunde genommen, habe ich nur eine Tabelle mit dem Namen der Sequenz, die aktuellen Wert & Erhöhungsbetrag.

Dann habe ich eine 4 Procs:

  • GetCurrentSequence (SequenceName)
  • GetNextSequence (SequenceName)
  • CreateSequence (SequenceName, startvalue, incrementAmount)
  • DeleteSequence (SequenceName)

Aber es gibt eine Einschränkung Sie nicht schätzen kann; Funktionen können nicht Nebenwirkungen haben. So könnten Sie eine Funktion für GetCurrentSequence (...) erstellen, aber GetNextSequence (...) müßte ein proc sein, da Sie wahrscheinlich den aktuellen Sequenzwert erhöhen mögen. Wenn es jedoch ein proc ist, werden Sie nicht in der Lage sein, es zu verwenden, um direkt in Ihren Insert-Anweisungen.

So anstelle von

insert into mytable(id, ....) values( GetNextSequence('MySequence'), ....);

Stattdessen müssen Sie es über 2 Zeilen brechen;

declare @newID int;
exec @newID = GetNextSequence 'MySequence';
insert into mytable(id, ....) values(@newID, ....);

Auch SQL Server hat keinen Mechanismus, der so etwas wie

tun können
MySequence.Current

oder

MySequence.Next

Ich hofft, jemand wird mir sagen, ich bin falsch mit den oben genannten Einschränkungen, aber ich bin mir ziemlich sicher, dass sie richtig sind.

Viel Glück.

Wenn Sie eine Menge Code haben, Sie gehen eine massive Überarbeitung des Codes tun wollen, sowieso; was gut funktioniert in Oracle ist in MSSQL nicht immer gut gehen zu arbeiten. Wenn Sie eine Menge von Cursor, zum Beispiel haben, während Sie sie Zeile für Zeile zu MSSQL konvertieren könnte, sind Sie nicht eine gute Leistung in Gang zu bringen.

Kurz gesagt, ist dies keine leichte Aufgabe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top