Partager via


Aide et astuces : interroger à l’aide d’un temps de trajet au cours d’une instruction (préversion)

Dans Microsoft Fabric, la possibilité d’utiliser un temps de trajet permet d’interroger les versions antérieures des données sans avoir à générer de multiples copies de données, ce qui permet d’économiser sur les coûts de stockage. Cet article décrit comment interroger les tables de l’entrepôt en utilisant le temps de trajet au cours d’une instruction, au moyen de la clause OPTION T-SQL et la syntaxe FOR TIMESTAMP AS OF. Actuellement, cette fonctionnalité est uniquement disponible en tant que version préliminaire.

Les tables de l’entrepôt peuvent être interrogées sur une période de rétention de trente jours calendaires au maximum à l’aide de la clause OPTION, en indiquant le format de date yyyy-MM-ddTHH:mm:ss[.fff].

Les exemples suivants peuvent être exécutés dans l’Éditeur de requête SQL, SQL Server Management Studio (SSMS), Azure Data Studio ou tout autre Éditeur de requête T-SQL.

Remarque

Actuellement, seul le fuseau horaire UTC (Temps universel coordonné) est utilisé pour le temps de trajet.

Temps de trajet sur une table d’entrepôt

Cet exemple décrit la manière de parcourir le temps de trajet sur une table individuelle dans l’entrepôt.

La clause OPTION T-SQL spécifie le point dans le temps pour rendre les données.

/* Time travel using a SELECT statement */
SELECT *
FROM [dbo].[dimension_customer]
OPTION (FOR TIMESTAMP AS OF '2024-05-02T20:44:13.700');

Temps de trajet sur plusieurs tables d’entrepôt

La clause OPTION est déclarée une fois par une requête et les résultats de la requête reflètent l’état des données à l’horodateur spécifié dans la requête pour toutes les tables.

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');

Temps de trajet dans une procédure stockée

Les procédures stockées sont un ensemble d’instructions SQL précompilées et stockées de manière à pouvoir être utilisées à plusieurs reprises. La clause OPTION peut être déclarée une fois dans la procédure stockée, et le jeu de résultats reflète l’état de toutes les tables à l’horodateur spécifié.

La clause FOR TIMESTAMP AS OF ne peut pas accepter directement une variable, car les valeurs de cette clause OPTION doivent être déterministes. Vous pouvez utiliser sp_executesql pour transférer une valeur DateHeure fortement typée à la procédure stockée. Cet exemple simple transfère une variable et convertit le paramètre DateHeure au format nécessaire avec le style de date 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

Ensuite, vous pouvez appeler la procédure stockée et transférer une variable en tant que paramètre fortement typé. Par exemple :

--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = '2024-05-10T22:56:15.457';
EXEC dbo.sales_by_city @pointInTime;

Ou, par exemple :

--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = DATEADD(dd, -7, GETDATE())
EXEC dbo.sales_by_city @pointInTime;

Temps de trajet dans une vue

Les vues représentent une requête enregistrée qui récupère dynamiquement les données d’une ou de plusieurs tables chaque fois que la vue est interrogée. La clause OPTION peut être utilisée pour interroger les vues afin que les résultats reflètent l’état des données à l’horodateur spécifié dans la requête.

--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'); 

Toutefois, vous ne pouvez pas interroger les données transférées à partir des tables d’une vue avant la création de la vue.

Limites

Pour plus d’informations sur les limitations des temps de trajet au niveau des instructions avec FOR TIMESTAMP AS OF, consultez Limitations des temps de trajet.