¿Por qué UNPIVOT funciona en el nivel de compatibilidad 80 DB?


8

Estoy tratando de extraer datos utilizando UNPIVOT en una base de datos SQL Server 2008 SP3 que se ejecuta en el Nivel de compatibilidad 80. Esto debería significar que UNPIVOT no funciona, pero en mi caso lo hace en ciertas circunstancias ...

Trabajos:

Consulta SELECT independiente del formulario:

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

No funciona

Misma consulta, dentro de una LEFT JOIN ()en otras tablas en diferentes bases de datos dentro del mismo servidor. Todo a nivel de compatibilidad 80.

Me sale el mensaje de error habitual:

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.

UNPIVOTLas soluciones alternativas parecen engorrosas y me gustaría que esta consulta sea autónoma y actualizable si es posible. Parece lógico que si puedo hacer que la consulta funcione de forma aislada, debería ser posible usarla en a JOIN.

Preguntas:

¿Por qué esto funciona a veces?

¿Cómo puedo lograr la UNPIVOTsubconsulta dentro de JOINestas condiciones?

Unpivot Sub-Query: (Por solicitud ...)

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

Respuestas:


10

La respuesta está en el mensaje de error:

Es posible que deba establecer el nivel de compatibilidad de la base de datos actual en un valor más alto para habilitar esta función.

Donde 'base de datos actual' significa la base de datos de contexto, es decir, la base de datos en la que se ejecuta la consulta, que no es necesariamente la misma que la base de datos a la que se hace referencia en la consulta. Por ejemplo, lo siguiente produce el mensaje de error:

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;

Lo siguiente se ejecuta con éxito (suponiendo que tempdbtenga un nivel de compatibilidad> 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;

Debe verificar cuál es la base de datos de contexto para la conexión que produce el error.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.