Sql 列与unpivot列表中其他列的类型冲突

Sql 列与unpivot列表中其他列的类型冲突,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,Im将sys.[views]透视成键值对,以便与另一台服务器上的值进行比较,以进行一致性测试。我遇到了一个返回错误的问题 Msg 8167,16级,状态1,第51行 列类型的类型与UNPIVOT列表中指定的其他列的类型冲突 SELECT PersonId, ColumnName, Value FROM People unpivot(Value FOR ColumnName IN (FirstName, LastName)) unpiv; 查询: SELECT sourceUnpivoted.i

Im将sys.[views]透视成键值对,以便与另一台服务器上的值进行比较,以进行一致性测试。我遇到了一个返回错误的问题

Msg 8167,16级,状态1,第51行

列类型的类型与UNPIVOT列表中指定的其他列的类型冲突

SELECT PersonId, ColumnName, Value
FROM People
unpivot(Value FOR ColumnName IN (FirstName, LastName)) unpiv;
查询:

SELECT
sourceUnpivoted.idServer,
sourceUnpivoted.sourceServerName,
sourceUnpivoted.name,
sourceUnpivoted.columnName,
sourceUnpivoted.columnValue
FROM (
SELECT 
CAST('1' AS VARCHAR(255)) AS idServer,
CAST('thisOne' AS VARCHAR(255)) AS sourceServerName,
CAST('theDatabase' AS VARCHAR(255)) AS sourceDatabaseName,
CAST(name AS VARCHAR(255)) AS name,
CAST(object_id AS VARCHAR(255)) AS object_id,
CAST(principal_id AS VARCHAR(255)) AS principal_id,
CAST(schema_id AS VARCHAR(255)) AS schema_id,
CAST(parent_object_id AS VARCHAR(255)) AS parent_object_id,
CAST(type AS VARCHAR(255)) AS type,
CAST(type_desc AS VARCHAR(255)) AS type_desc,
CAST(create_date AS VARCHAR(255)) AS create_date,
CAST(lock_escalation_desc AS VARCHAR(255)) AS lock_escalation_desc
...
FROM noc_test.dbo.stage_sysTables
) AS databaseTables
UNPIVOT (
columnValue FOR columnName IN (
object_id,
principal_id,
schema_id,
parent_object_id,
type,
type_desc,
create_date,
lock_escalation_desc
) 
) AS sourceUnpivoted
为什么这不像[类型]、[类型描述]、[锁定升级描述]???
我也试过CONVERTVARCHAR255,类型为type,实际上这是一个排序问题。我可以通过更改以下行来解决此问题:

CAST([type] collate database_default AS VARCHAR(255)) AS [type], 
CAST(type_desc collate database_default AS VARCHAR(255)) AS type_desc, 
CAST(create_date AS VARCHAR(255)) AS create_date, 
CAST(lock_escalation_desc collate database_default AS VARCHAR(255)) AS lock_escalation_desc 

具体的问题是,名称被整理为Latin1_General_CI_as,而您提到的其他3列被整理为Latin1_General_CI_as_KS_WS至少,在我的机器上,我不确定在具有不同默认排序规则的服务器/数据库上会是什么样子。

这是此类型错误的解决方案之一

1:创建此表的

CREATE TABLE People
(
PersonId int, 
Firstname varchar(50), 
Lastname varchar(25)
)
2:然后插入

INSERT INTO People VALUES (1, 'Jim', 'Smith');
INSERT INTO People VALUES (2, 'Jane', 'Jones');
INSERT INTO People VALUES (3, 'Bob', 'Unicorn');
3:运行此脚本,您将获得错误

Msg 8167,16级,状态1,第3行 Lastname列的类型与UNPIVOT列表中指定的其他列的类型冲突

SELECT PersonId, ColumnName, Value
FROM People
unpivot(Value FOR ColumnName IN (FirstName, LastName)) unpiv;
4:解决方案是必须使用子查询首先强制转换Lastname列,使其与Firstname具有相同的长度

SELECT PersonId, ColumnName, Value
FROM (
SELECT personid, firstname, cast(lastname AS VARCHAR(50)) lastname
FROM People
) d
unpivot(Value FOR ColumnName IN (FirstName, LastName)) unpiv;

PIVOT/UNPIVOT子句对SSMS中右键单击->属性列的ANSI填充状态以及类型、大小和排序规则非常敏感。在添加或重新创建有问题的列之前,请尝试在会话中指定SET ANSI|u PADDING ON | OFF,使其与PIVOT/UNPIVOT子句中的其他列匹配。

遇到了相同的错误,我只是使表中的所有列都具有相同的数据类型-我混合了不同长度的int、varchar和nvarchar。一旦我将表中的所有列转换为同一类型——nvarchar255,它就工作得非常好

我也有同样的问题。通过右键单击列标题并选择使用区域设置更改类型,修复了此问题。见附件屏幕截图


您是否手工将所有这些添加到您的问题中?如果是这样的话,你是否认为应该有更好的方法?如果您正在发布代码,请突出显示代码块,并点击{}代码格式按钮-它保留换行符,并且还添加了语法高亮显示。下次我会尝试一下。在这种动态查询情况下不起作用:将@sql='SELECT maxcol FROM SELECT cast'+@col+'设置为numeric3,0 selectedcols FROM table d unpivotcol FOR selectedcols in'+@col+'unpiv';从昨天到今天早上,exec@sqlI一直在拉扯我的头发。我又看了一眼你的答案,通过引用4,我的轴心得以运转。我的问题专栏的长度必须与我正在撰写的其他专栏的长度完全相同。感谢您的帮助。在动态查询中如何使其工作如下:将@sql='SELECT maxcol FROM SELECT cast'+@col+'设置为numeric3,0 selectedcols FROM表d unpivotcol for selectedcols in'+@col+'unpiv';exec@sql这个答案对我来说比上面的更有意义,谢谢。