在我们的数据库中,大多数表都有一个名为
为了避免该字段具有错误值,存在触发器(有时是
现在我正在执行一个更新语句(实际上是
有没有办法绕过
遵循Larnu建议后的结果
我运行了提供的示例,唯一的例外是将
我猜这里的输出忽略了触发器,返回了在
一样。现在疯狂的部分来了。我把插入和删除的日期都画出来了:
在更新操作中,默认值不会出现,但实际表格和查询结果中有不同的值。我不知道如何让这些值相同,也不清楚在更新操作中发生了什么事情。
dbupddate
的字段,表示行上最后一次INSERT
或UPDATE
的datetime
。为了避免该字段具有错误值,存在触发器(有时是
AFTER
,有时是INSTEAD OF
),确保最终值是正确的,而不是任何其他人可能尝试写入该字段的“手动”值。现在我正在执行一个更新语句(实际上是
MERGE
),并且我想要一个包括该字段的OUTPUT
子句。根据我在适当的微软文章中阅读到的内容,OUTPUT
忽略触发器。有没有办法绕过
OUTPUT
返回触发器后dbupddate
的值?我不想进行另一个查询以获取信息,因为无法保证在这些查询之间的瞬间,另一个用户的第三个查询不会改变所有内容。
遵循Larnu建议后的结果
我运行了提供的示例,唯一的例外是将
updatetime
字段的default
值更改为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
在更新操作中,默认值不会出现,但实际表格和查询结果中有不同的值。我不知道如何让这些值相同,也不清楚在更新操作中发生了什么事情。
AFTER
和INSTEAD OF
触发器,只需使用其中之一即可。 - Thom A