共用方式為


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

在 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 的陳述式層級限制時間移動的詳細資訊,請參閱時間移動限制