Migration de votre code SQL vers SQL Data WarehouseMigrate your SQL code to SQL Data Warehouse

Cet article vous explique les éventuelles modifications de code que vous aurez à réaliser lors de la migration de votre code depuis une autre base de données vers SQL DATA Warehouse.This article explains code changes you will probably need to make when migrating your code from another database to SQL Data Warehouse. Certaines fonctionnalités de SQL Data Warehouse peuvent améliorer considérablement les performances, dans la mesure où elles sont conçues pour fonctionner selon un modèle distribué.Some SQL Data Warehouse features can significantly improve performance as they are designed to work in a distributed fashion. Toutefois, pour maintenir des niveaux appropriés de performance et d’évolutivité, certaines fonctions ne sont pas disponibles.However, to maintain performance and scale, some features are also not available.

Limites courantes de T-SQLCommon T-SQL Limitations

La liste suivante répertorie les fonctionnalités les plus courantes que SQL Data Warehouse ne prend pas en charge.The following list summarizes the most common features that SQL Data Warehouse does not support. Les liens vous présentent des solutions de contournement pour les fonctionnalités non prises en charge :The links take you to workarounds for the unsupported features:

Fort heureusement, la plupart de ces restrictions peuvent être contournées.Fortunately most of these limitations can be worked around. Des explications sont fournies dans les articles de développement référencés ci-dessus.Explanations are provided in the relevant development articles referenced above.

Fonctionnalités CTE prises en chargeSupported CTE features

Les expressions de table communes (CTE) sont partiellement prises en charge dans SQL Data Warehouse.Common table expressions (CTEs) are partially supported in SQL Data Warehouse. Les fonctionnalités CTE actuellement prises en charge sont les suivantes :The following CTE features are currently supported:

  • Une CTE peut être spécifiée dans une instruction SELECT.A CTE can be specified in a SELECT statement.
  • Une CTE peut être spécifiée dans une instruction CREATE VIEW.A CTE can be specified in a CREATE VIEW statement.
  • Une CTE peut être spécifiée dans une instruction CREATE TABLE AS SELECT (CTAS).A CTE can be specified in a CREATE TABLE AS SELECT (CTAS) statement.
  • Une CTE peut être spécifiée dans une instruction CREATE REMOTE TABLE AS SELECT (CRTAS).A CTE can be specified in a CREATE REMOTE TABLE AS SELECT (CRTAS) statement.
  • Une CTE peut être spécifiée dans une instruction CREATE EXTERNAL TABLE AS SELECT (CETAS).A CTE can be specified in a CREATE EXTERNAL TABLE AS SELECT (CETAS) statement.
  • Une table distante peut être référencée à partir d’une expression de table commune.A remote table can be referenced from a CTE.
  • Une table externe peut être référencée à partir d’une expression de table commune.An external table can be referenced from a CTE.
  • Plusieurs définitions de requête CTE peuvent être définies dans une expression de table commune.Multiple CTE query definitions can be defined in a CTE.

Limitations d’une CTECTE Limitations

Les expressions de table communes présentent certaines restrictions dans SQL Data Warehouse, notamment :Common table expressions have some limitations in SQL Data Warehouse including:

  • Une CTE doit être suivie d’une instruction SELECT unique.A CTE must be followed by a single SELECT statement. Les instructions INSERT, UPDATE, DELETE et MERGE ne sont pas prises en charge.INSERT, UPDATE, DELETE, and MERGE statements are not supported.
  • Une expression de table commune qui inclut des références à elle-même (expression de table commune récursive) n’est pas prise en charge (voir la section ci-dessous).A common table expression that includes references to itself (a recursive common table expression) is not supported (see below section).
  • La spécification de plusieurs clauses WITH dans une CTE n’est pas autorisée.Specifying more than one WITH clause in a CTE is not allowed. Par exemple, si une définition CTE_query_definition contient une sous-requête, celle-ci ne peut pas contenir de clause WITH imbriquée définissant une autre CTE.For example, if a CTE_query_definition contains a subquery, that subquery cannot contain a nested WITH clause that defines another CTE.
  • Une clause ORDER BY ne peut pas être utilisée dans une définition CTE_query_definition, sauf lorsqu’une clause TOP est spécifiée.An ORDER BY clause cannot be used in the CTE_query_definition, except when a TOP clause is specified.
  • Lorsqu’une CTE est utilisée dans une instruction qui fait partie d’un lot, l’instruction qui la précède doit être suivie d’un point-virgule.When a CTE is used in a statement that is part of a batch, the statement before it must be followed by a semicolon.
  • Lorsqu’une CTE est utilisée dans des instructions préparées par sp_prepare, celle-ci se comporte de la même façon que les autres instructions SELECT dans PDW.When used in statements prepared by sp_prepare, CTEs will behave the same way as other SELECT statements in PDW. Toutefois, si les expressions de table communes sont utilisées dans le cadre de CETAS préparées par sp_prepare, le comportement peut différer selon qu’il s’agit d’instructions SQL Server ou PDW en raison de la façon dont la liaison est mise en œuvre pour sp_prepare.However, if CTEs are used as part of CETAS prepared by sp_prepare, the behavior can defer from SQL Server and other PDW statements because of the way binding is implemented for sp_prepare. Si l’instruction SELECT qui référence CTE utilise une colonne erronée, qui n’existe pas dans CTE, sp_prepare transmet sans détecter l’erreur, mais l’erreur est levée pendant l’instruction sp_execute.If SELECT that references CTE is using a wrong column that does not exist in CTE, the sp_prepare will pass without detecting the error, but the error will be thrown during sp_execute instead.

CTE récursivesRecursive CTEs

Les expressions de table communes récursives ne sont pas prises en charge dans SQL Data Warehouse.Recursive CTEs are not supported in SQL Data Warehouse. La migration de CTE récursives peut être relativement complexe et la meilleure solution reste de décomposer le processus en plusieurs étapes.The migration of recursive CTE can be somewhat complex and the best process is to break it into multiple steps. Vous pouvez généralement utiliser une boucle pour une table temporaire pendant que vous parcourez les requêtes intermédiaires récursives.You can typically use a loop and populate a temporary table as you iterate over the recursive interim queries. Une fois la table temporaire remplie, vous pouvez renvoyer les données sous forme d’un seul jeu de résultats.Once the temporary table is populated you can then return the data as a single result set. Une approche similaire a été utilisée pour résoudre GROUP BY WITH CUBE dans l’article Regroupement par clause à l’aide des options rollup/cube/grouping sets.A similar approach has been used to solve GROUP BY WITH CUBE in the group by clause with rollup / cube / grouping sets options article.

Fonctions système non prises en chargeUnsupported system functions

Certaines fonctions système ne sont pas prises en charge.There are also some system functions that are not supported. Voici les principales fonctions habituellement associées aux entrepôts de données :Some of the main ones you might typically find used in data warehousing are:

  • NEWSEQUENTIALID()NEWSEQUENTIALID()
  • @@NESTLEVEL()@@NESTLEVEL()
  • @@IDENTITY()@@IDENTITY()
  • @@ROWCOUNT()@@ROWCOUNT()
  • ROWCOUNT_BIGROWCOUNT_BIG
  • ERROR_LINE()ERROR_LINE()

Certains de ces problèmes peuvent être contournés.Some of these issues can be worked around.

Solution de contournement pour @@ROWCOUNT@@ROWCOUNT workaround

Pour contourner l’absence de prise en charge de @@ROWCOUNT, créez une procédure stockée qui récupère le dernier nombre de lignes de sys.dm_pdw_request_steps puis exécute EXEC LastRowCount après une instruction DML.To work around lack of support for @@ROWCOUNT, create a stored procedure that will retrieve the last row count from sys.dm_pdw_request_steps and then execute EXEC LastRowCount after a DML statement.

CREATE PROCEDURE LastRowCount AS
WITH LastRequest as 
(   SELECT TOP 1    request_id
    FROM            sys.dm_pdw_exec_requests
    WHERE           session_id = SESSION_ID()
    AND             resource_class IS NOT NULL
    ORDER BY end_time DESC
),
LastRequestRowCounts as
(
    SELECT  step_index, row_count
    FROM    sys.dm_pdw_request_steps
    WHERE   row_count >= 0
    AND     request_id IN (SELECT request_id from LastRequest)
)
SELECT TOP 1 row_count FROM LastRequestRowCounts ORDER BY step_index DESC
;

Étapes suivantesNext steps

Pour obtenir la liste complète de toutes les instructions T-SQL prises en charge, consultez les rubriques Transact-SQL.For a complete list of all supported T-SQL statements, see Transact-SQL topics.