SQL Server 触发器 :如果 A 列为空或空值 SET 值为 X 时插入新行时



我正在尝试创建一个SQL Server触发器,以便在CONTACT中插入新行时,如果列Contact_Type为空白''NULL,则应将其设置为PCON

我创建的触发器不起作用。我以前没有创建过任何触发器,所以我已经超出了我的深度,任何帮助将不胜感激。

我假设我在插入的表格的 where 子句中搞砸了一些东西?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[EJ_ConTACT_TYPE_DefaultValue_INS] 
ON [dbo].[CONTACT] 
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;

DECLARE @defaultvalue varchar(6) = 'PCON'
UPDATE [dbo].[CONTACT]
SET Contact_Type = @defaultvalue
FROM inserted i
WHERE [dbo].[CONTACT].[Contact_Type] = i.Contact_Type
AND (i.[Contact_Type] = '' OR i.[Contact_Type] = NULL)
END
GO

就个人而言,就像我在评论中提到的,我只会创建一个默认约束:

ALTER TABLE dbo.Contact ADD CONSTRAINT df_Contact_ContactType DEFAULT 'PCON' FOR Contact_Type;

然后,您只需省略INSERT中的列,该列将具有该值。例如:

INSERT INTO dbo.Contact (Column1, Column2, Column3)
VALUES('abc',1,'20200916');

这将导致列Contact_Type的值为'PCON'

至于为什么你的触发器不起作用,一个问题是因为你的WHERE.[dbo].[CONTACT].[ConTACT_TYPE] = i.ConTACT_TYPE永远不会是列ConTACT_TYPE(你的列名称中真的有那个奇怪的大小写吗..NULLNULL等于没有,包括NULL本身。这也适用于您的条款OR [ConTACT_TYPE] = NULL。最后,我怀疑该值是否唯一,因此它会更新不应更新的行。

如果您"必须"在TRIGGER中执行此操作(我建议您不要这样做),请使用JOIN的主键。此外,不要对列使用 3+ 部分命名:列上的 3+ 部分命名将被弃用。这会导致以下结果:

CREATE TRIGGER [dbo].[EJ_Contact_Type_DefaultValue] ON [dbo].[contact]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;

--DECLARE @defaultvalue varchar(6) = 'PCON'
UPDATE C
SET Contact_type = 'PCON'
FROM dbo.Contact C
JOIN inserted i ON C.ID = i.ID
WHERE i.Contact_type = ''
OR i.Contact_type IS NULL;
END;
GO

最新更新