Tại sao UNPIVOT hoạt động trên mức tương thích 80 DB?


8

Tôi đang cố gắng kéo dữ liệu bằng UNPIVOT trên cơ sở dữ liệu SP3 của SQL Server 2008 chạy ở cấp độ tương thích 80. Điều này có nghĩa là UNPIVOT không hoạt động, nhưng trong trường hợp của tôi, nó thực hiện trong một số trường hợp nhất định ...

Làm:

Truy vấn CHỌN độc lập có dạng:

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

Không hoạt động:

Cùng một truy vấn, trong một LEFT JOIN ()bảng trên các cơ sở dữ liệu khác nhau trong cùng một máy chủ. Tất cả ở mức độ tương thích 80.

Tôi nhận được thông báo lỗi thông thường:

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.

UNPIVOTcách giải quyết có vẻ rườm rà và tôi muốn truy vấn này được khép kín và làm mới nếu có thể. Có vẻ hợp lý rằng nếu tôi có thể làm cho truy vấn hoạt động một cách cô lập, thì có thể sử dụng nó trong a JOIN.

Câu hỏi:

Tại sao điều này đôi khi làm việc?

Làm thế nào tôi có thể đạt được UNPIVOTtruy vấn phụ bên trong trong JOINcác điều kiện này?

Truy vấn phụ không theo trục: (Theo yêu cầu ...)

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

Câu trả lời:


10

Câu trả lời là trong thông báo lỗi:

Bạn có thể cần đặt mức độ tương thích của cơ sở dữ liệu hiện tại thành giá trị cao hơn để bật tính năng này.

Trong đó 'cơ sở dữ liệu hiện tại' có nghĩa là cơ sở dữ liệu ngữ cảnh - tức là cơ sở dữ liệu mà truy vấn được thực thi, không nhất thiết giống như cơ sở dữ liệu được tham chiếu trong truy vấn. Ví dụ: phần sau đây tạo ra thông báo lỗi:

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;

Sau đây thực hiện thành công (giả sử tempdbcó mức độ tương thích> 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;

Bạn cần kiểm tra cơ sở dữ liệu ngữ cảnh cho kết nối tạo ra lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.