Pourquoi UNPIVOT fonctionne-t-il sur le niveau de compatibilité 80 DB?


8

J'essaie d'extraire des données à l'aide d'UNPIVOT sur une base de données SQL Server 2008 SP3 fonctionnant au niveau de compatibilité 80. Cela devrait signifier que UNPIVOT ne fonctionne pas, mais dans mon cas, c'est le cas dans certaines circonstances ...

Travaux:

Requête SELECT indépendante du formulaire:

SELECT...FROM...UNPIVOT...WHERE...GROUP BY

Ne fonctionne pas:

Même requête, dans une LEFT JOIN ()autre table sur différentes bases de données au sein du même serveur. Le tout au niveau de compatibilité 80.

Je reçois le message d'erreur habituel:

Msg 325, Level 15, State 1, Line 165
Incorrect syntax near 'UNPIVOT'. You may need to set the compatibility level
of the current database to a higher value to enable this feature. See help for
the SET COMPATIBILITY_LEVEL option of ALTER DATABASE.

UNPIVOTles solutions de contournement semblent lourdes et j'aimerais que cette requête soit autonome et actualisable si possible. Il semble logique que si je peux faire fonctionner la requête de manière isolée, il devrait être possible de l'utiliser dans un fichier JOIN.

Des questions:

Pourquoi cela fonctionne-t-il parfois?

Comment puis-je réaliser la UNPIVOTsous-requête à l'intérieur de JOINdans ces conditions?

Sous-requête non pivotante: (sur demande ...)

SELECT 
    YEAR(CAST('1-'+UnPiv.[Date] AS DATE)) "Year",
    MONTH(CAST('1-'+UnPiv.[Date] AS DATE)) "Month",
    CASE [Channel_Org]
        WHEN 'TPR' THEN 'ERP'
        ELSE [Channel_Org]
    END AS [Channel_Org],
    ISNULL(SUM(CASE WHEN [GL Desc] = 'EIP' AND 
        [OPEX_Group] = 'Postpaid SAC' THEN [Amount] END),0) "Post EIP",
    ISNULL(SUM(CASE WHEN [GL Desc] = 'EIP' AND
        [OPEX_Group] = 'Prepaid SAC' THEN [Amount] END),0) "Pre EIP",
    ISNULL(SUM(CASE WHEN [GL Desc] = 'EIP' AND
        [OPEX_Group] = 'SRC' THEN [Amount] END),0) "Upg EIP",
    ISNULL(SUM(CASE WHEN [GL Desc] = 'MDF (OEM)' AND
        [OPEX_Group] = 'Postpaid SAC' THEN [Amount] END),0) "Post MDF",
    ISNULL(SUM(CASE WHEN [GL Desc] = 'MDF (OEM)' AND
        [OPEX_Group] = 'Prepaid SAC' THEN [Amount] END),0) "Pre MDF",
    ISNULL(SUM(CASE WHEN [GL Desc] = 'MDF (OEM)' AND
        [OPEX_Group] = 'SRC' THEN [Amount] END),0) "Upg MDF"
FROM [Channel_Steering].[dbo].[AQ1_OPEX_View]
UNPIVOT (Amount FOR [Date] IN ( [Jan-14],
                                [Feb-14],
                                [Mar-14],
                                [Apr-14],
                                [May-14],
                                [Jun-14],
                                [Jul-14],
                                [Aug-14],
                                [Sep-14],
                                [Oct-14],
                                [Nov-14],
                                [Dec-14])) UnPiv
WHERE   (   [Channel_Org] IN ('Retail','TPR')
                AND
            [GL Desc] IN ('MDF (OEM)', 'EIP')
        )
GROUP BY
    [Channel_Org],
    YEAR(CAST('1-'+UnPiv.[Date] AS DATE)),
    MONTH(CAST('1-'+UnPiv.[Date] AS DATE))

Réponses:


10

La réponse est dans le message d'erreur:

Vous devrez peut-être définir le niveau de compatibilité de la base de données actuelle sur une valeur plus élevée pour activer cette fonctionnalité.

Où «base de données actuelle» signifie la base de données de contexte - c'est-à-dire la base de données dans laquelle la requête est exécutée, qui n'est pas nécessairement la même que la base de données référencée dans la requête. Par exemple, ce qui suit génère le message d'erreur:

USE AdventureWorks;
GO
ALTER DATABASE AdventureWorks 
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT
    U.SystemInformationID,
    U.[Database Version],
    U.ColumnName,
    U.Value
FROM AdventureWorks.dbo.AWBuildVersion AS ABV
UNPIVOT 
(
    Value 
    FOR ColumnName IN 
        (
        VersionDate,
        ModifiedDate
        )
) AS U;

L'exécution suivante réussit (en supposant tempdbun niveau de compatibilité> 80):

USE AdventureWorks;
GO
ALTER DATABASE AdventureWorks 
SET COMPATIBILITY_LEVEL = 80;
GO
USE tempdb; -- Context database
GO
SELECT
    U.SystemInformationID,
    U.[Database Version],
    U.ColumnName,
    U.Value
FROM AdventureWorks.dbo.AWBuildVersion AS ABV -- Still references data in AW DB
UNPIVOT 
(
    Value 
    FOR ColumnName IN 
        (
        VersionDate,
        ModifiedDate
        )
) AS U;

Vous devez vérifier la base de données de contexte pour la connexion qui produit l'erreur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.