【问题标题】:Type cast error when unpivoting columns, why?反透视列时出现类型转换错误,为什么?
【发布时间】:2014-01-22 09:48:52
【问题描述】:

我正在尝试对 mdsb.sys.database 表中的某些列进行 UNPIVOT,但某些列存在一些问题。在 UNPIVOTing 表之前,我尝试在 CTE 中将所有列强制转换为 NVARCHAR(128),但它仍然不起作用。有人可以解释为什么以及如何解决这个问题吗?

;
WITH props AS (
SELECT 
    [name]
    ,CAST([collation_name] AS NVARCHAR(128)) AS [collation_name]
    ,CAST([is_auto_close_on] AS NVARCHAR(128)) AS [is_auto_close_on]
    ,CAST([is_auto_shrink_on] AS NVARCHAR(128)) AS [is_auto_shrink_on]
    ,CAST([is_auto_create_stats_on] AS NVARCHAR(128)) AS [is_auto_create_stats_on]
    ,CAST([is_auto_update_stats_async_on] AS NVARCHAR(128)) AS [is_auto_update_stats_async_on]
    ,CAST([is_auto_update_stats_on] AS NVARCHAR(128)) AS [is_auto_update_stats_on]
    ,CAST(CASE WHEN [is_parameterization_forced] = 0 THEN N'SIMPLE' ELSE N'FORCED' END AS NVARCHAR(128)) AS [is_parameterization_forced]
    ,CAST([is_trustworthy_on] AS NVARCHAR(128)) AS [is_trustworthy_on]
    ,CAST([compatibility_level] AS NVARCHAR(128)) AS [compatibility_level]
    ,CAST([page_verify_option_desc] AS NVARCHAR(128)) AS [page_verify_option_desc]
FROM sys.databases s
WHERE [name] = DB_NAME()
)
SELECT [name]
        ,[property]
        ,[value] 
FROM [props]
UNPIVOT
(
    [value]
    FOR [property] IN ([collation_name] 
                        ,[is_auto_close_on]
                        ,[is_auto_shrink_on]
                        ,[is_auto_create_stats_on]
                        ,[is_auto_update_stats_async_on]
                        ,[is_auto_update_stats_on]
                        ,[is_parameterization_forced]
                        ,[is_trustworthy_on]
                        ,[compatibility_level]
                        ,[page_verify_option_desc]
                        )
) AS u

错误:

Msg 8167, Level 16, State 1, Line 34
The type of column "page_verify_option_desc" conflicts with the type of other columns specified in the UNPIVOT list.

结果应该看起来像这样,但带有“page_verify_option_desc”行和“recovery_model_desc”。

name    property    value
master  collation_name  SQL_Latin1_General_CP1_CI_AS
master  is_auto_close_on    0
master  is_auto_shrink_on   0
master  is_auto_create_stats_on 1
master  is_auto_update_stats_async_on   0
master  is_auto_update_stats_on 1
master  is_parameterization_forced  SIMPLE
master  is_trustworthy_on   0
master  compatibility_level 110

【问题讨论】:

    标签: sql tsql common-table-expression unpivot


    【解决方案1】:

    我认为这实际上是一个排序问题

    这样试试

      ;
    WITH props AS (
    SELECT 
        [name]
        ,CAST([collation_name] AS NVARCHAR(128)) AS [collation_name]
        ,CAST([is_auto_close_on] AS NVARCHAR(128)) AS [is_auto_close_on]
        ,CAST([is_auto_shrink_on] AS NVARCHAR(128)) AS [is_auto_shrink_on]
        ,CAST([is_auto_create_stats_on] AS NVARCHAR(128)) AS [is_auto_create_stats_on]
        ,CAST([is_auto_update_stats_async_on] AS NVARCHAR(128)) AS [is_auto_update_stats_async_on]
        ,CAST([is_auto_update_stats_on] AS NVARCHAR(128)) AS [is_auto_update_stats_on]
        ,CAST(CASE WHEN [is_parameterization_forced] = 0 THEN N'SIMPLE' ELSE N'FORCED' END AS NVARCHAR(128)) AS [is_parameterization_forced]
        ,CAST([is_trustworthy_on] AS NVARCHAR(128)) AS [is_trustworthy_on]
        ,CAST([compatibility_level] AS NVARCHAR(128)) AS [compatibility_level]
        ,CAST([page_verify_option_desc] collate database_default AS NVARCHAR(128)) AS [page_verify_option_desc]
    FROM sys.databases s
    WHERE [name] = DB_NAME()
    )
    SELECT [name]
            ,[property]
            ,[value] 
    FROM [props]
    UNPIVOT
    (
        [value]
        FOR [property] IN ([collation_name] 
                            ,[is_auto_close_on]
                            ,[is_auto_shrink_on]
                            ,[is_auto_create_stats_on]
                            ,[is_auto_update_stats_async_on]
                            ,[is_auto_update_stats_on]
                            ,[is_parameterization_forced]
                            ,[is_trustworthy_on]
                            ,[compatibility_level]
                            ,[page_verify_option_desc]
                            )
    ) AS u
    

    【讨论】:

    • 看起来我无法在 unpivot 中进行投射。之前必须这样做。
    • 哦,你尝试过 collat​​e database_default
    • 我已经更新了 collat​​e database_default。请检查一下
    • @DanielBjörk - 视图sys.databases 从具有资源数据库排序规则的sys.syspalvalues 中提取描述文本。运行 SELECT * FROM sys.databases WHERE page_verify_option_desc = collation_name 也会产生排序规则冲突。
    • 在 MS SQL SERVER 中,可以在列级别设置排序规则。当比较查询中的 2 个不同的排序规则列时,会出现此错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多