您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在INSTEAD OF INSERT触发器中使用默认值

在INSTEAD OF INSERT触发器中使用默认值

保罗:我已经解决了这个问题。最终。有点肮脏的解决方案,可能并不符合每个人的口味,但是我对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

删除临时表

SQL 2022/1/1 18:51:29 有401人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶