2016-01-08 45 views
0

我正在将Access数据库迁移到SQL Server 2014 Express后端,并且应用程序按原样设计为在某些表中的某些列中放置空字符串,而不是NULL (访问在附加表单上的行为)。SQL Server触发器将NULL更改为空字符串

原来我不能,因为当通过连接到绑定的形式表不允许在这些列空ODBC连接表显式访问时试图插入NULL值,当有人简单地删除列的内容,甚至如果我有一个默认值在表中定义。

我想先说一下,我将解决这个问题以正确处理NULL,但对于'现在',我的优先考虑是将后端转换为与Access中操作相同的SQL,所以我只想要一个触发器将几个字段上的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次更新。也许这并不重要,因为这只是暂时的,但只是对其他更有经验的想法感到好奇。

+0

Access只把空字符串,如果这样设计的。作为在整个申请中采用标准来存储空值的一般规则是优选的。如果Access表设计遵循此标准,则迁移到SQL服务器将是无缝的。如果Access表设计不允许ZLS,那么清空Access窗体中的文本框将导致表中的空值。因此,将这些应用程序迁移到SQL Server将继续工作,而不会更改VBA代码。清空文本框将在SQL Server和Access中保存为空。一个人应该避免混合使用ZLS和空值 –

回答

1

使用下面的update语句,更新一个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; 
+0

好吧,这就是我在选择2时的想法。我认为检查以确保字段更新可能稍微有效一些,但正如我所说的,我认为效率并不是真正的问题现在,因为无论如何这都应该是暂时的。我会很快对此进行测试,以验证它是否按预期工作。谢谢。 –

+0

@TravisP请让stackoverflow知道它是否工作! – Hiten004

+1

(cc:@TravisP) - 使用'ISNULL(FieldName,'')'会更紧凑一些,否则它看起来是一个很好的解决方法。 –