我可以從哪裡獲得 SQL Server 事務開始時間?
我正在使用 SQL Server 中的時態表,生成的時間是 UTC datetime2 中的事務開始時間
SQL Server 中是否有一個函式或表可以讓相同的事務開始時間在其他地方使用,而不需要我先寫入系統版本表並從中選擇?
我有一些非系統版本的表是同一事務的一部分,我希望記錄的 datetime2 與它們匹配,而不是使用
SysUTCDateTime
並讓它變化。我試圖從中提取它,
sys.dm_tran_active_transactions
但它的日期時間和本地伺服器時間似乎也不同?系統版本:2017-04-11 14:00:59.4690673
活躍交易:2017-04-11 15:00:59.467
您可以從sys.dm_tran_current_transaction獲取目前事務的 id 。
然後您可以從sys.dm_tran_active_transactions
transaction_begin_time
獲取該列。因此,請使用以下 T-SQL 語句之一:
SELECT transaction_begin_time = dtat.transaction_begin_time FROM sys.dm_tran_current_transaction dtct INNER JOIN sys.dm_tran_active_transactions dtat ON dtct.transaction_id = dtat.transaction_id;
要麼
SELECT transaction_begin_time = dtat.transaction_begin_time FROM sys.dm_tran_active_transactions dtat WHERE dtat.transaction_id = CURRENT_TRANSACTION_ID();
CURRENT_TRANSACTION_ID( )從
transaction_id
.sys.dm_tran_current_transaction
不需要我先寫入系統版本表並從中進行選擇?
由於您至少已經在事務中寫入版本化表,因此您可以使用該
OUTPUT
子句SysStartTime
從那裡記錄(或其他名稱,如果您不使用通用名稱),如下所示:DECLARE @StampsOfTime TABLE (ts DATETIME2) INSERT Testo (SomeField) OUTPUT (INSERTED.SysStartTime) INTO @StampsOfTime VALUES (1) -- if using it multiple times it would be more efficient to put it in a variable instead of using the table var in future statements DECLARE @ts DATETIME2 = (SELECT TOP 1 ts FROM @StampsOfTime)
然後,您可以使用它來填充非臨時表中所需的列,並且您避免了編寫額外的行(事務無論如何都會進行此更改)或在系統表周圍搜尋以讀取完整的精度時間,儘管它確實需要創建一個表變數並從中進行選擇,這可能不會更好。這裡要注意的另一件事是,
NULL
如果INSERT
語句使用可能返回零行的動態結果,您可能會返回。該OUTPUT
子句也適用於DELETE
、UPDATE
和MERGE
語句。