我不熟悉我需要将Oracle触发器转换为MSSQL的MSSQL触发器
这是Oracle触发器: -
create or replace trigger TRG_GRP_SEQ
before insert on T_USER_GROUP
for each row
begin
select count(*) into :new.GROUPSEQUENCE from T_USER_GROUP;
end;
我在填写之前的陈述时遇到了麻烦,每个人都需要帮忙。
描述:此触发器在将每一行插入表T_USER_GROUP之前,GROUPSEQUENCE将递增一个值,确定总计数(就像ID生成一样)
感谢。
答案 0 :(得分:1)
下面应该接近你所追求的。 SQL Server没有BEFORE触发器,因此您必须使用INSTEAD OF触发器并在其中执行插入。此外,SQL Server没有逐行触发器,所有触发操作都是基于集合的(插入/删除表)。
CREATE TRIGGER TRG_GRP_SEQ
ON T_USER_GROUP
INSTEAD OF INSERT
AS
INSERT INTO T_USER_GROUP (
..column list...
)
SELECT ...columns...,
SELECT ROW_NUMBER() OVER(ORDER BY something) + (SELECT COUNT(*) FROM T_USER_GROUP),
...columns...
FROM inserted
答案 1 :(得分:1)
SQL Server可以创建列identity
,这意味着它们会自动增加新插入的行。我建议您使用一个,这样可以完全省去扳机。
如果您的表中已有数据,那么您将需要创建一个新表并按如下方式填充:
CREATE TABLE T_USER_GROUP_New (
GroupSequence int identity(1,1) NOT NULL,
<Other Columns ...>
);
SET IDENTITY_INSERT T_USER_GROUP_New ON;
INSERT T_USER_GROUP_New (GroupSequence, <OtherColumns ...>)
SELECT * FROM T_USER_GROUP;
SET IDENTITY_INSERT T_USER_GROUP_New OFF;
-- Add script here to drop FK constraints from any tables with an FK to T_USER_GROUP
EXEC sp_rename 'T_USER_GROUP', 'T_USER_GROUP_Old';
EXEC sp_rename 'T_USER_GROUP_New', 'T_USER_GROUP';
-- Add script here to recreate FK constraints from any tables with an FK to T_USER_GROUP
-- Add script here to add appropriate indexes and constraints to T_USER_GROUP
-- and rename or drop them from T_USER_GROUP_Old
现在,您可以在插入时完全跳过GroupSequence列,并且它将始终获得下一个递增的值。您可以像这样立即学习这个值:
DECLARE @NewGroupSequenceStart int,
@NewGroupSequenceEnd int;
INSERT T_USER_GROUP (<Columns not including GroupSequence ...>)
VALUES (<Values ...>);
-- or SELECT <Columns ...> FROM Somewhere
SELECT @NewGroupSequenceStart = Scope_Identity(), @NewGroupSequenceEnd = @@RowCount;
SET @NewGroupSequenceEnd = @NewGroupSequenceEnd + @NewGroupSequenceStart - 1;
-- Now these two variables have the start and end GroupSequence IDs
-- that were newly generated (you can insert multiple rows).
-- This could probably be cleaned up a little but I don't have time to test now.
答案 2 :(得分:1)
我想和Erik一起去,
如果你定义
CREATE T_USER_GROUP (GROUPSEQUENCE INT IDENTITY(1, 1) NOT NULL, GROUP_NAME nvarchar(100), ...)
你不需要这种触发器。 IDENTITY(1,1)表示计数器从1开始并以1递增。
INSERT T_USER_GROUP(GROUP_NAME)
VALUES('NewGroupName')
您将自动获得GROUPSEQUENCE中的下一个更高值。