2012-06-22 48 views
18

sys.[views]转换为关键值对以与另一台服务器上的值进行比较以进行一致性测试。我遇到了一个返回错误的问题。列与未转发列表中其他列的类型冲突

消息8167,级别16,状态1,第51行

的类型与在UNPIVOT列表中指定的其他列的类型列“类型”的冲突。

查询:

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 

为什么这个不喜欢[type][type_desc][lock_escalation_desc] ??? 我也试过CONVERT(VARCHAR(255),type) AS type

+1

您是否亲自将所有这些'
'添加到您的问题中?如果是这样,你没有达到你认为“必须有更好的方式”的点吗?如果您要发布代码,请突出显示它的代码块,然后点击代码格式化按钮 - 它保留换行符,并添加语法高亮显示。 –

+0

好生病下次再尝试一下。 – DarkRiver

回答

26

这实际上是一个排序问题。我可以通过改变这些行解决这个问题:

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 

的具体问题是,name被整理为Latin1_General_CI_AS,而你提到的被整理为Latin1_General_CI_AS_KS_WS其他3列(至少,我的机器上,我不确定在不同的默认排序规则下,服务器/数据库会是什么样子)。

+0

如何使它在如下动态查询的情况下工作:set @ sql ='SELECT max(col)FROM(SELECT cast('+ @ col +'as numeric(3,0))selectedcols FROM table)d unpivot(col FOR selectedcols IN('+ @ col +'))unpiv'; (@sql) – AskMe

10

这是这种类型的错误的解决方案

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:运行此脚本,你得到的error

Msg 8167,Level 16,State 1,Line 3 colu的类型mn“Lastname”与UNPIVOT列表中指定的其他列的类型冲突。

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

4:该解决方案是必须使用一个子查询第一投LASTNAME列具有相同的长度姓

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; 
+0

如果是这样的动态查询不工作:set @ sql ='SELECT max(col)FROM(SELECT cast('+ @ col +'as numeric(3,0))selectedcols FROM table)d unpivot (col for selectedcols IN('+ @ col +'))unpiv'; exec(@sql) – AskMe

3

枢轴/ UNPIVOT子句是的ANSI填充状态敏感该列(右键单击 - > SSMS中的属性)以及类型,大小和排序规则。在添加或重新创建相关列之前,请尝试在会话中指定SET ANSI_PADDING ON | OFF,以便它与PIVOT/UNPIVOT子句中的其他列匹配。

+0

这个答案对我来说比上面更有意义,谢谢。 –

1

就遇到了这个同样的错误,我只是在做相同的数据类型的表中的所有列 - 我有int混合,varchar,各种长度的nvarchar。一旦我将表格中的所有列转换为相同类型 - nvarchar(255)它完美运行。