在我们的数据库中,大多数表都有一个dbupddate
字段,该字段指示datetime
最后一个INSERT
或UPDATE
应用于该行。
为了避免该字段具有错误值,存在触发器(有时AFTER
,有时INSTEAD OF
),以确保最终该值是正确的,而不是有人可能尝试写入该字段的任何“手动”其他值。
现在我正在执行一个更新语句(实际上MERGE
),我想要一个OUTPUT
包含该字段的子句。正如我在相应的 MS 文章中所读到的,OUTPUT
忽略触发器。
是否有任何解决方法可以在触发器之后OUTPUT
返回值?dbupddate
我不想进行另一个查询来绘制信息,因为我不能保证在这些查询之间的瞬间,另一个用户的第三个查询可能不会改变一切。
听从拉努的建议后的结果
我运行了提供的示例,唯一的例外是将字段的default
值更改为,以便我能理解。我运行了 4 个查询中的每一个,然后从它们各自的表中选择并比较了这些值:updatetime
convert(datetime2,'1900-01-01')
updatetime
INSERT INTO dbo.Sample1 (Someint)
OUTPUT inserted.*
INTO @inserted
SELECT 1;
SELECT 'Sample1 INSERT',*
FROM @inserted; -- 1900-01-01 00:00:00.000000
select * from Sample1 -- 2018-11-05 13:12:13.141580
after
我猜这里的输出会忽略触发器并返回在触发器生效之前插入的默认值。
DECLARE @inserted table (ID int, Someint int, updatedtime datetime2(6))
INSERT INTO dbo.Sample2 (Someint)
OUTPUT inserted.*
INTO @inserted
SELECT 1;
SELECT 'Sample2 INSERT',* --1900-01-01 00:00:00.000000
FROM @inserted;
select * from Sample2 --2018-11-05 13:12:35.580190
相同的。现在疯狂的部分来了。我将插入的日期和删除的日期都画了出来:
DECLARE @updated table (ID int, Someint int, ins_updatedtime datetime2(6),del_updatedtime datetime2(6))
UPDATE dbo.Sample1
SET Someint = 2
OUTPUT Inserted.*,Deleted.updatetime
INTO @updated;
SELECT 'Sample1 UPDATE',*
FROM @updated; --Sample1 UPDATE 1 2 2018-11-05 13:30:01.348490 2018-11-05 13:30:01.348490
select * from Sample1 -- 1 2 2018-11-05 13:31:31.851047
DECLARE @updated table (ID int, Someint int, ins_updatedtime datetime2(6),del_updatedtime datetime2(6))
UPDATE dbo.Sample2
SET Someint = 2
OUTPUT Inserted.*,Deleted.updatetime
INTO @updated;
SELECT 'Sample2 UPDATE',* -- Sample2 UPDATE 1 2 2018-11-05 13:30:20.286422 2018-11-05 13:30:20.286422
FROM @updated;
select * from Sample2 --1 2 2018-11-05 13:31:51.679726
因此,在这些update
情况下,默认值不存在,但我在实际表和查询输出中有不同的值。我既不知道如何使这些值相同,也不知道更新案例中的日期时间究竟会发生什么。