需要帮助将此Oracle脚本转换为SQL Server

时间:2019-01-25 05:23:26

标签: sql sql-server database-migration

我需要将此在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 :(得分:0)

首先请create a sequence on SQL Server database

CREATE SEQUENCE SEQ_DCIIPF
  START WITH 1
  INCREMENT BY 1;
GO

然后假设您的数据库表如下

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

如下创建您的SQL Instead of Insert trigger

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吗?您可以考虑在数据库的DDL中使用IDENTITY列

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

这还使您能够像序列号生成器一样,以有序的方式插入唯一的整数值

答案 1 :(得分:0)

您不需要触发器,序列和默认值即可完成工作。

CREATE SEQUENCE SEQ_DCIIPF START WITH 1;

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

)

答案 2 :(得分:0)

您正在尝试重新创建identity列。只需删除触发器并为SQL Server正确定义列即可:

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

请注意,identity()可以有时有间隔。但是,要确保没有差距是非常昂贵的,而且某些情况(例如事务回滚和竞争条件)很难处理。

identity()列通常用于此目的(Oracle现在在12+中支持等效列)。