我需要将此在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;
答案 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+中支持等效列)。