保罗:我已经解决了这个问题。最终。有点肮脏的解决方案,可能并不符合每个人的口味,但是我对sql Server还是很陌生,例如:
在Replace_of_INSERT触发器中:
将插入的虚拟表的数据结构复制到临时表中:
SELECT * INTO aTempInserted FROM Inserted WHERE 1=2
创建一个视图以确定该视图的基础表(来自系统表)的默认约束,并使用它们来构建将复制临时表中的约束的语句:
SELECT 'ALTER TABLE dbo.aTempInserted
ADD CONSTRAINT ' + dc.name + 'Temp' +
' DEFAULT(' + dc.deFinition + ')
FOR ' + c.name AS Cmd, OBJECT_NAME(c.object_id) AS Name
FROM sys.default_constraints AS dc INNER JOIN sys.columns AS c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id
使用游标遍历检索到的集合并执行每个语句。这将为您提供一个临时表,该表的默认值与要插入的表的默认值相同。
将默认记录插入临时表(从“插入的虚拟表”创建的所有字段都可以为空):
INSERT INTO aTempInserted DEFAULT VALUES
将记录从“插入的”虚拟表复制到视图的基础表(如果没有触发,则原本应在其中插入记录),并加入临时表以提供默认值。这需要使用COALESCE函数,以便仅默认未提供的值:
INSERT INTO realTable([a], [b],
SELECT COALESCE(I.[a], T.[a]),
COALESCE(I.[a], T.[b])
FROM Inserted AS I,
aTempInserted AS T
删除临时表