Sql-Server

我可以從哪裡獲得 SQL Server 事務開始時間?

  • February 1, 2021

我正在使用 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_transactionstransaction_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子句也適用於DELETEUPDATEMERGE語句。

引用自:https://dba.stackexchange.com/questions/170723