Perché UNPIVOT funziona con livello di compatibilità 80 DB?


8

Sto cercando di estrarre i dati utilizzando UNPIVOT su un database SQL Server 2008 SP3 in esecuzione a livello di compatibilità 80. Ciò dovrebbe significare che UNPIVOT non funziona, ma nel mio caso lo fa in determinate circostanze ...

Lavori:

Query SELECT indipendente del modulo:

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

Non funziona:

Stessa query, all'interno di LEFT JOIN ()altre tabelle su database diversi all'interno dello stesso server. Tutto a livello di compatibilità 80.

Ricevo il solito messaggio di errore:

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.

UNPIVOTle soluzioni alternative sembrano ingombranti e vorrei che questa query fosse autonoma e aggiornabile se possibile. Sembra logico che se riesco a far funzionare la query in modo isolato, dovrebbe essere possibile usarla in a JOIN.

Domande:

Perché a volte funziona?

Come posso ottenere la UNPIVOTsottoquery all'interno di JOINqueste condizioni?

Sottoprogettazione non pivot: (su richiesta ...)

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

Risposte:


10

La risposta è nel messaggio di errore:

Potrebbe essere necessario impostare il livello di compatibilità del database corrente su un valore più elevato per abilitare questa funzione.

Dove "database corrente" indica il database di contesto, ovvero il database in cui viene eseguita la query, che non è necessariamente uguale al database a cui fa riferimento la query. Ad esempio, quanto segue produce il messaggio di errore:

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;

Il seguente viene eseguito correttamente (supponendo che tempdbabbia un livello di 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;

È necessario verificare quale sia il database di contesto per la connessione che genera l'errore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.