Нужна помощь в преобразовании этого сценария Oracle в SQL Server - PullRequest
0 голосов
/ 25 января 2019

Мне нужно преобразовать эти сценарии, которые запускались в Oracle, в сценарий, который будет работать на SQL Server.

Спасибо

CREATE OR REPLACE TRIGGER VM1DTA.TR_DCIIPF ON VM1DTA.DCIIPF AS 
INSTEAD OF INSERT  
AS 
    DECLARE @v_pkValue FLOAT;
    DECLARE @WHILE 1 = 0 
BEGIN
    IF @@FETCH_STATUS <> 0 BREAK;

BEGIN
    SELECT @v_pkValue = SEQ_DCIIPF.nextval;

    SET @:New.unique_number = v_pkValue;
END TR_DCIIPF;

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вам не нужен триггер, последовательность и значение по умолчанию сделают всю работу.

CREATE SEQUENCE SEQ_DCIIPF START WITH 1;

CREATE TABLE DCIIPF
(
    unique_number int NOT NULL DEFAULT (NEXT VALUE FOR SEQ_DCIIPF),
    .....

)
0 голосов
/ 25 января 2019

Вы пытаетесь воссоздать identity столбцы. Просто удалите триггер и правильно определите столбец для SQL Server:

create table DCIIPF (
    unique_number int identity(1, 1),  -- probably a primary key
    . . .
);

Обратите внимание, что identity() столбцы могут иногда иметь пробелы. Однако гарантировать отсутствие пробелов достаточно дорого, а некоторые ситуации, такие как откат транзакций и условия гонки, очень трудно обрабатывать.

identity() столбцы обычно используются для этой цели (и Oracle теперь поддерживает эквивалент в 12 +).

0 голосов
/ 25 января 2019

Прежде всего, пожалуйста создайте последовательность в базе данных SQL Server

CREATE SEQUENCE SEQ_DCIIPF
  START WITH 1
  INCREMENT BY 1;
GO

Затем при условии, что ваша таблица базы данных выглядит следующим образом

create table VM1DTA.DCIIPF (
    unique_number int,
    col1 varchar(3)
)

Создайте SQL вместо триггера вставки следующим образом

Create or Alter Trigger VM1DTA.TR_DCIIPF on VM1DTA.DCIIPF Instead Of Insert
AS
Begin

    Insert Into VM1DTA.DCIIPF (unique_number, col1)
    select
         (NEXT VALUE FOR SEQ_DCIIPF), col1
    from inserted

End
go

Следующий скрипт позволит вам протестировать результаты

insert into VM1DTA.DCIIPF (col1) values ('A'),('B'),('C'),('D')
select * from VM1DTA.DCIIPF

Один вопрос: вам действительно требуется SEQUENCE в дизайне вашей базы данных?,Вы можете подумать об использовании столбца IDENTITY следующим образом в DDL вашей базы данных

create table VM1DTA.DCIIPF (
    unique_number int not null identity(1,1) ,
    col1 varchar(3)
)

Это также позволит вам вставлять уникальные целочисленные значения упорядоченным образом, точно так же, как генератор порядковых чисел

...