如何:在語句層級使用時間移動進行查詢 (預覽)
在 Microsoft Fabric 中,時間移動的功能可解除鎖定查詢舊版數據的能力,而不需要產生多個數據復本,節省記憶體成本。 本文說明如何使用 T-SQL OPTION 子句 和 FOR TIMESTAMP AS OF 語法,使用語句層級的時間移動來查詢倉儲數據表。 此功能目前為預覽功能。
您可以使用 子句來查詢倉儲數據表,最多可以查詢 30 個日曆天的 OPTION
保留期間,並提供日期格式 yyyy-MM-ddTHH:mm:ss[.fff]
。
下列範例可以在 SQL 查詢編輯器、SQL Server Management Studio (SSMS)、Azure Data Studio 或任何 T-SQL 查詢編輯器中執行。
注意
目前,只會使用國際標準時間(UTC)時區進行時間旅行。
倉儲數據表上的時間移動
此範例示範如何在倉儲中的個別數據表上時程移動。
OPTION T-SQL 子句會指定傳回數據的時間點。
/* Time travel using a SELECT statement */
SELECT *
FROM [dbo].[dimension_customer]
OPTION (FOR TIMESTAMP AS OF '2024-05-02T20:44:13.700');
多個倉儲數據表的時間移動
OPTION 子句會針對每個查詢宣告一次,而且查詢的結果會反映所有數據表查詢中所指定時間戳的數據狀態。
SELECT Sales.StockItemKey,
Sales.Description,
CAST (Sales.Quantity AS int)) AS SoldQuantity,
c.Customer
FROM [dbo].[fact_sale] AS Sales INNER JOIN [dbo].[dimension_customer] AS c
ON Sales.CustomerKey = c.CustomerKey
GROUP BY Sales.StockItemKey, Sales.Description, Sales.Quantity, c.Customer
ORDER BY Sales.StockItemKey
OPTION (FOR TIMESTAMP AS OF '2024-05-02T20:44:13.700');
預存程式中的時間移動
預存程式是一組預先編譯並儲存的 SQL 語句,以便重複使用。 OPTION 子句可以在預存程式中宣告一次,而結果集會反映指定時間戳上所有數據表的狀態。
子 FOR TIMESTAMP AS OF
句無法直接接受變數,因為這個 OPTION
子句中的值必須具決定性。 您可以使用 sp_executesql 將強型別 日期時間 值傳遞至預存程式。 這個簡單的範例會傳遞變數,並將 datetime 參數轉換成具有日期樣式 126 的必要格式。
CREATE PROCEDURE [dbo].[sales_by_city] (@pointInTime DATETIME)
AS
BEGIN
DECLARE @selectForTimestampStatement NVARCHAR(4000);
DECLARE @pointInTimeLiteral VARCHAR(33);
SET @pointInTimeLiteral = CONVERT(VARCHAR(33), @pointInTime, 126);
SET @selectForTimestampStatement = '
SELECT *
FROM [dbo].[fact_sale]
OPTION (FOR TIMESTAMP AS OF ''' + @pointInTimeLiteral + ''')';
EXEC sp_executesql @selectForTimestampStatement
END
然後,您可以呼叫預存程式,並以強型別參數的形式傳入變數。 例如:
--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = '2024-05-10T22:56:15.457';
EXEC dbo.sales_by_city @pointInTime;
或者,例如:
--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = DATEADD(dd, -7, GETDATE())
EXEC dbo.sales_by_city @pointInTime;
檢視中的時間移動
檢視代表儲存的查詢,每當查詢檢視時,就會動態擷取一或多個數據表的數據。 OPTION 子句可用來查詢檢視,以便結果反映查詢中所指定時間戳的數據狀態。
--Create View
CREATE VIEW Top10CustomersView
AS
SELECT TOP (10)
FS.[CustomerKey],
DC.[Customer],
SUM(FS.TotalIncludingTax) AS TotalSalesAmount
FROM
[dbo].[dimension_customer] AS DC
INNER JOIN
[dbo].[fact_sale] AS FS ON DC.[CustomerKey] = FS.[CustomerKey]
GROUP BY
FS.[CustomerKey],
DC.[Customer]
ORDER BY
TotalSalesAmount DESC;
/*View of Top10 Customers as of a point in time*/
SELECT *
FROM [Timetravel].[dbo].[Top10CustomersView]
OPTION (FOR TIMESTAMP AS OF '2024-05-01T21:55:27.513');
不過,在檢視建立檢視之前,您無法從 檢視中查詢數據表的過去數據。
限制
如需使用 之語句層級限制 FOR TIMESTAMP AS OF
的時間移動詳細資訊,請參閱 時間移動限制。