共用方式為


如何:在語句層級使用時間移動進行查詢 (預覽)

在 Microsoft Fabric 中,時間移動的功能可解除鎖定查詢舊版數據的能力,而不需要產生多個數據復本,節省記憶體成本。 本文說明如何使用 T-SQL OPTION 子句FOR TIMESTAMP AS OF 語法,使用語句層級的時間移動來查詢倉儲數據表。 此功能目前為預覽功能。

您可以使用 子句來查詢倉儲數據表,最多可以查詢七個行事歷天的 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的時間移動詳細資訊,請參閱 時間移動限制