Возможно ли в SQL Server создать функцию, которая могла бы обрабатывать последовательность?

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

Вопрос

Мы рассматриваем различные варианты переноса нашего уровня персистентности из Oracle в другую базу данных, и один из них – MS SQL.Однако мы используем последовательности Oracle во всем коде, и поэтому кажется, что перемещение будет головной болью.Я понимаю насчет @identity, но это будет серьезная переработка кода персистентности.

Возможно ли в SQL Server создать функцию, которая могла бы обрабатывать последовательность?

Это было полезно?

Решение

Это зависит от вашего текущего использования последовательностей в Oracle.Обычно последовательность считывается в триггере Insert.

Судя по вашему вопросу, я предполагаю, что именно уровень персистентности генерирует последовательность перед вставкой в ​​базу данных (включая новый ПК)

В MSSQL вы можете комбинировать операторы SQL с помощью ';', поэтому для получения столбца идентификаторов вновь созданной записи используйте INSERT INTO...;ВЫБЕРИТЕ SCOPE_IDENTITY()

Таким образом, команда вставки записи возвращает набор записей с одной строкой и одним столбцом, содержащим значение столбца идентификаторов.

Конечно, вы можете изменить этот подход и создать таблицы последовательностей (аналогичные двойной таблице в Oracle) примерно так:

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

Другие советы

Я сделал это в прошлом году в рамках проекта.По сути, я только что создал таблицу с именем последовательности, текущим значением и величиной приращения.

Затем я создал 4 процесса:

  • GetCurrentSequence(имяпоследовательности)
  • GetNextSequence(имяпоследовательности)
  • CreateSequence(имяпоследовательности, начальное значение, приращение суммы)
  • УдалитьПоследовательность(имяпоследовательности)

Но есть ограничение, которое вы можете не оценить;функции не могут иметь побочных эффектов.Таким образом, вы можете создать функцию для GetCurrentSequence(...), но GetNextSequence(...) должна быть процедурой, поскольку вы, вероятно, захотите увеличить текущее значение последовательности.Однако, если это процедура, вы не сможете использовать ее непосредственно в операторах вставки.

Поэтому вместо

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

Вместо этого вам нужно будет разбить его на две строки;

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

Кроме того, в SQL Server нет механизма, который мог бы делать что-то вроде

MySequence.Current

или

MySequence.Next

Надеюсь, кто-нибудь скажет мне, что я ошибаюсь в приведенных выше ограничениях, но я почти уверен, что они точны.

Удачи.

Если у вас много кода, вам все равно придется провести его масштабную переработку;то, что хорошо работает в Oracle, не всегда будет хорошо работать в MSSQL.Например, если у вас много курсоров, хотя вы можете построчно преобразовать их в MSSQL, вы не получите хорошей производительности.

Короче говоря, это непростая задача.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top