Mengapa UNPIVOT Bekerja pada Tingkat Kompatibilitas 80 DB?

8

Saya mencoba untuk menarik data menggunakan UNPIVOT pada database SQL Server 2008 SP3 yang berjalan pada Tingkat Kompatibilitas 80. Ini berarti UNPIVOT tidak berfungsi, tetapi dalam kasus saya itu tidak dalam keadaan tertentu ...

Bekerja:

Permintaan SELECT independen dari formulir:

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

Tidak bekerja:

Kueri yang sama, di dalam LEFT JOIN ()tabel lain di database berbeda dalam server yang sama. Semua pada tingkat kompatibilitas 80.

Saya mendapatkan pesan kesalahan yang biasa:

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.

UNPIVOTsolusi tampaknya rumit dan saya ingin query ini mandiri dan dapat disegarkan jika memungkinkan. Tampaknya logis bahwa jika saya bisa membuat kueri berfungsi secara terpisah, seharusnya dimungkinkan untuk menggunakannya dalam JOIN.

Pertanyaan:

Mengapa terkadang ini berhasil?

Bagaimana saya bisa mencapai UNPIVOTsub-kueri di JOINdalam kondisi ini?

Batalkan Sub-Kueri: (Atas permintaan ...)

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
sumber

Jawaban:

10

Jawabannya ada dalam pesan kesalahan:

Anda mungkin perlu mengatur tingkat kompatibilitas database saat ini ke nilai yang lebih tinggi untuk mengaktifkan fitur ini.

Di mana 'basis data saat ini' berarti basis data konteks - yaitu basis data yang dieksekusi, yang tidak harus sama dengan basis data yang direferensikan dalam kueri. Misalnya, berikut ini menghasilkan pesan kesalahan:

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;

Berikut ini dijalankan dengan sukses (dengan asumsi tempdbmemiliki tingkat kompatibilitas> 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;

Anda perlu memeriksa apa konteks database untuk koneksi yang menghasilkan kesalahan.

Paul White 9
sumber