Поделиться через


Практическое руководство. Запрос с помощью перемещения по времени на уровне инструкции (предварительная версия)

В 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см. в разделе "Ограничения на поездки по времени".