我正在将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次更新。也许这并不重要,因为这只是暂时的,但只是对其他更有经验的想法感到好奇。
Access只把空字符串,如果这样设计的。作为在整个申请中采用标准来存储空值的一般规则是优选的。如果Access表设计遵循此标准,则迁移到SQL服务器将是无缝的。如果Access表设计不允许ZLS,那么清空Access窗体中的文本框将导致表中的空值。因此,将这些应用程序迁移到SQL Server将继续工作,而不会更改VBA代码。清空文本框将在SQL Server和Access中保存为空。一个人应该避免混合使用ZLS和空值 –