SQL Server触发器将NULL更改为空字符串

时间:2016-01-08 19:49:27

标签: sql-server ms-access triggers

我正在将Access数据库迁移到SQL Server 2014 Express后端,而应用程序实际上是将空字符串放在某些表的某些列中而不是NULL(Access在附加表单上的行为)。 / p>

事实证明,我不能让这些列中的表不允许空值,因为当通过ODBC附加表附加到绑定表单时,当有人只是删除列的内容时,显式尝试插入NULL值,即使我在表上定义了一个默认值。

我想预先说明我将修复它以正确处理NULL,但对于'现在',我的优先级是让后端转换为SQL操作与Access中的相同,所以我只是想要一个触发器来改变几个字段上的NULL值以清空字符串,直到我可以查看所有应用程序逻辑,这些逻辑在这些字段中正在期待空字符串并将其更改为处理NULL。

我想出了以下内容:

CREATE TRIGGER TABLE1_ReplaceNulls 
ON TABLE1
AFTER INSERT, UPDATE
AS
    IF UPDATE(FIELDWNULL1) 
    BEGIN
        UPDATE TABLE1 
        SET FIELDWNULL1 = '' 
        FROM inserted I 
        INNER JOIN TABLE1 ON I.PKFIELD = TABLE1.PKFIELD 
        WHERE I.FIELDWNULL1 IS NULL;
    END;

这适用于单个列。如何在同一个表中的多列中执行此操作?我有一个包含4列的表,所有列都可以包含NULLS,但我想要空字符串代替它们。

我是否应该为每个可以包含NULL的列执行单独的IF块,或者只是一次处理它?当然,如果我一次处理它,我将不得不考虑一些列可能具有合法值,但如果我单独执行语句,那么在插入列之后它基本上可以运行4次更新。也许这无关紧要,因为这只是暂时的,但只是对其他更有经验的想法感到好奇。

1 个答案:

答案 0 :(得分:1)

使用以下更新语句,在一个trans中更新所有四列。此代码未经过测试。

      UPDATE TABLE1 
        SET FIELDWNULL1=iif(FIELDWNULL1 is null,'',FIELDWNULL1),
        FIELDWNULL2=iif(FIELDWNULL2 is null,'',FIELDWNULL2), 
        FIELDWNULL3=iif(FIELDWNULL3 is null,'',FIELDWNULL3), 
        FIELDWNULL4=iif(FIELDWNULL4 is null,'',FIELDWNULL4) 

        FROM inserted I INNER JOIN TABLE1
            ON I.PKFIELD = TABLE1.PKFIELD 

新的触发器代码:使用IIF声明

CREATE TRIGGER TABLE1_ReplaceNulls ON TABLE1
AFTER INSERT, UPDATE
AS

--IF UPDATE(FIELDWNULL1) 
    BEGIN
        UPDATE TABLE1 
        SET FIELDWNULL1=iif(FIELDWNULL1 is null,'',FIELDWNULL1),
        FIELDWNULL2=iif(FIELDWNULL2 is null,'',FIELDWNULL2), 
        FIELDWNULL3=iif(FIELDWNULL3 is null,'',FIELDWNULL3), 
        FIELDWNULL4=iif(FIELDWNULL4 is null,'',FIELDWNULL4) 

        FROM inserted I INNER JOIN TABLE1
            ON I.PKFIELD = TABLE1.PKFIELD 
            --WHERE I.FIELDWNULL1 IS NULL;
    END;

使用ISNULL()函数

CREATE TRIGGER TABLE1_ReplaceNulls ON TABLE1
AFTER INSERT, UPDATE
AS

--IF UPDATE(FIELDWNULL1) 
    BEGIN
        UPDATE TABLE1 
        SET FIELDWNULL1=ISNULL(FIELDWNULL1,''),
        FIELDWNULL2=ISNULL(FIELDWNULL2,''), 
        FIELDWNULL3=ISNULL(FIELDWNULL3,''), 
        FIELDWNULL4=ISNULL(FIELDWNULL4,'') 

        FROM inserted I INNER JOIN TABLE1
            ON I.PKFIELD = TABLE1.PKFIELD 
            --WHERE I.FIELDWNULL1 IS NULL;
    END;