Sql server 插入前的SQL Server触发器

Sql server 插入前的SQL Server触发器,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我有一个包含几列的表,我想创建一个触发器,从一个或多个列中获取值,并在另一列中设置值 例如: 表test包含列test1、test2、test3 我想从test2和test3中获取值,并在test1中设置它们。 原因是test1定义为NOTNULL,值必须是test2+test3 我可以在插入前在触发器中执行此操作吗?您可以添加如下所示的计算列,无需触发器 create table t1 ( t1 as t2+t3, t2 int, t3 int ) 您可以添加如下所示的计算列,无需触发器 c

我有一个包含几列的表,我想创建一个触发器,从一个或多个列中获取值,并在另一列中设置值

例如:

表test包含列test1、test2、test3

我想从test2和test3中获取值,并在test1中设置它们。 原因是test1定义为NOTNULL,值必须是test2+test3


我可以在插入前在触发器中执行此操作吗?

您可以添加如下所示的计算列,无需触发器

create table t1
(
t1 as t2+t3,
t2 int,
t3 int
)

您可以添加如下所示的计算列,无需触发器

create table t1
(
t1 as t2+t3,
t2 int,
t3 int
)
试试这个:

IF OBJECT_ID('[dbo].[Demo]') IS NOT NULL
BEGIN
    DROP TABLE [dbo].[Demo];
END;

CREATE TABLE [dbo].[Demo]
(
    [test1] INT NOT NULL
   ,[test2] INT
   ,[test3] INT
);

GO

/*
Msg 515, Level 16, State 2, Line 15
Cannot insert the value NULL into column 'test1', table 'TEST.dbo.Demo'; column does not allow nulls. INSERT fails.
*/

INSERT INTO [dbo].[Demo] ([test2], [test3])
VALUES (1, 1);

GO

CREATE TRIGGER TRG_DEMO_I_I ON [dbo].[Demo] INSTEAD  OF INSERT AS
BEGIN 

    INSERT INTO [dbo].[Demo] ([test1], [test2], [test3])
    SELECT [test2] + [test3], [test2], [test3]
    FROM inserted;
END;

GO

-- this is OK
INSERT INTO [dbo].[Demo] ([test2], [test3])
VALUES (1, 1);

SELECT *
FROM [dbo].[Demo];

GO
试试这个:

IF OBJECT_ID('[dbo].[Demo]') IS NOT NULL
BEGIN
    DROP TABLE [dbo].[Demo];
END;

CREATE TABLE [dbo].[Demo]
(
    [test1] INT NOT NULL
   ,[test2] INT
   ,[test3] INT
);

GO

/*
Msg 515, Level 16, State 2, Line 15
Cannot insert the value NULL into column 'test1', table 'TEST.dbo.Demo'; column does not allow nulls. INSERT fails.
*/

INSERT INTO [dbo].[Demo] ([test2], [test3])
VALUES (1, 1);

GO

CREATE TRIGGER TRG_DEMO_I_I ON [dbo].[Demo] INSTEAD  OF INSERT AS
BEGIN 

    INSERT INTO [dbo].[Demo] ([test1], [test2], [test3])
    SELECT [test2] + [test3], [test2], [test3]
    FROM inserted;
END;

GO

-- this is OK
INSERT INTO [dbo].[Demo] ([test2], [test3])
VALUES (1, 1);

SELECT *
FROM [dbo].[Demo];

GO

SQL Server在插入之前没有
触发器-唯一的选项(如果您确实必须使用触发器)是
而不是插入触发器SQL Server在插入之前没有
触发器-唯一的选项(如果您确实必须使用触发器)是
而不是插入触发器如果t1为非空,那么上述查询是否有效?我认为t1值应该保留,如果它不为null,那么必须从t2和t3计算。如果它为null,那么我忘了说t2和t3不为null。如果t1为非null,那么上面的查询会工作吗?我认为t1值应该保留,如果它不是空的,那么必须从t2和t3计算,如果它是空的,我忘了说t2和t3不是空的