我们在视图上有一个替代插入触发器,它将所有值从INSERTED虚拟表复制到另一个表。
列表中的一个字段对于目标表是不可为空的,并且具有指定的默认值。
我们遇到的是,一些应用程序代码正在发送一个insert命令,而没有指定不可为空的字段 - 如果插件是针对实际表执行的,通常会导致SQL Server插入列&# 39; s默认值。但是,触发器对所有字段都是显式的,因此触发器会尝试为该字段插入null ...导致错误。
我不想要的是这样的代码......
INSERT INTO XXXX (col1, col2, col3)
SELECT
ISNULL(col1, 0), ISNULL(COL2, 0), ISNULL(COL3, 0)
FROM INSERTED
我不希望触发器需要知道每列的实际默认值(从可维护性的角度来看)......
有没有人有更好的解决方案?
由于
答案 0 :(得分:0)
当您的应用程序将NULL值发送到不可为空的列时,没有太多选项。特别是当你不想在isnull上使用输入验证时。
我们在这种情况下使用默认值。如果有可能你可以改变你的表:
ALTER TABLE xxxx ADD CONSTRAINT DF_col1 DEFAULT N'default' FOR col1;
答案 1 :(得分:0)
我可以想到一种丑陋而低效的方式。我们的想法是插入默认行,然后使用try
/ catch
一次更新列,以忽略错误。
declare @Id int;
insert int XXX DEFAULT VALUES;
set @id = @@IDENTITY;
begin try
update XXX set col1 = val1 where id = @id;
end try
begin catch
end catch;
begin try
update XXX set col2 = val2 where id = @id;
end try
begin catch
end catch;
. . .
如果必须在100列上执行此操作,那么这可能是一个坏主意。如果您只有两到三列导致问题,那么这可能会解决您的问题。