Warum funktioniert UNPIVOT mit der Kompatibilitätsstufe 80 DB?

8

Ich versuche, Daten mit UNPIVOT in einer SQL Server 2008 SP3-Datenbank abzurufen, die auf Kompatibilitätsstufe 80 ausgeführt wird. Dies sollte bedeuten, dass UNPIVOT nicht funktioniert, in meinem Fall jedoch unter bestimmten Umständen ...

Werke:

Unabhängige SELECT-Abfrage des Formulars:

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

Funktioniert nicht:

Dieselbe Abfrage in einer LEFT JOIN ()anderen Tabelle in verschiedenen Datenbanken auf demselben Server. Alles auf Kompatibilitätsstufe 80.

Ich erhalte die übliche Fehlermeldung:

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.

UNPIVOTProblemumgehungen scheinen umständlich zu sein, und ich möchte, dass diese Abfrage in sich geschlossen und wenn möglich aktualisierbar ist. Es scheint logisch, dass es möglich sein sollte, die Abfrage in einem zu verwenden, wenn ich sie isoliert arbeiten lassen kann JOIN.

Fragen:

Warum funktioniert das manchmal?

Wie kann ich unter diesen Bedingungen die UNPIVOTUnterabfrage innerhalb von erreichen JOIN?

Unpivot-Unterabfrage: (Auf Anfrage ...)

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))
Andrew
quelle

Antworten:

10

Die Antwort ist in der Fehlermeldung:

Möglicherweise müssen Sie die Kompatibilitätsstufe der aktuellen Datenbank auf einen höheren Wert einstellen , um diese Funktion zu aktivieren.

Wobei "aktuelle Datenbank" die Kontextdatenbank bedeutet, dh die Datenbank, in der die Abfrage ausgeführt wird, die nicht unbedingt mit der Datenbank übereinstimmt, auf die in der Abfrage verwiesen wird. Folgendes erzeugt beispielsweise die Fehlermeldung:

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;

Folgendes wird erfolgreich ausgeführt (vorausgesetzt, es tempdbliegt eine Kompatibilitätsstufe> 80 vor):

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;

Sie müssen überprüfen, welche Kontextdatenbank für die Verbindung vorhanden ist, die den Fehler verursacht.

Paul White 9
quelle