2008-11-27 8 views
0

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

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

ответ

1

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

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

В MSSQL, вы можете комбинировать операторы SQL с «;», так, чтобы получить столбец идентичности только что созданной записи, используйте INSERT INTO ...; SELECT SCOPE_IDENTITY()

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

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

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

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

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

1

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

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

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

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

Таким образом, вместо

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

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

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

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

MySequence.Current 

или

MySequence.Next 

Будем надеяться, что кто-то скажет мне, что я неправильно с вышеуказанными ограничениями , но я уверен, что они точны.

Удачи.