我正在将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次更新。也许这无关紧要,因为这只是暂时的,但只是对其他更有经验的想法感到好奇。
答案 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;