Dar*_*ver 29 sql t-sql sql-server-2008
我sys.[views]转入键值对,与另一台服务器上的值进行比较,以进行一致性测试.我遇到了一个返回错误的问题.
消息8167,第16级,状态1,第51行
列"type"的类型与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
Run Code Online (Sandbox Code Playgroud)
为什么这个不喜欢[type],[type_desc],[lock_escalation_desc]??? 我也试过了CONVERT(VARCHAR(255),type) AS type
Dam*_*ver 32
这实际上是一个整理问题.我可以通过更改这些行来解决它:
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
Run Code Online (Sandbox Code Playgroud)
具体问题是name整理为Latin1_General_CI_AS,而你提到的其他3列整理为Latin1_General_CI_AS_KS_WS(至少,在我的机器上,我不知道在具有不同默认排序规则的服务器/数据库上会是什么样).
小智 19
这是此类型错误的解决方案之一
1:创建此表
CREATE TABLE People
(
PersonId int,
Firstname varchar(50),
Lastname varchar(25)
)
Run Code Online (Sandbox Code Playgroud)
2:然后插入
INSERT INTO People VALUES (1, 'Jim', 'Smith');
INSERT INTO People VALUES (2, 'Jane', 'Jones');
INSERT INTO People VALUES (3, 'Bob', 'Unicorn');
Run Code Online (Sandbox Code Playgroud)
3:运行此脚本会出现错误
消息8167,级别16,状态1,行3"Lastname"列的类型与UNPIVOT列表中指定的其他列的类型冲突.
SELECT PersonId, ColumnName, Value
FROM People
unpivot(Value FOR ColumnName IN (FirstName, LastName)) unpiv;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
小智 5
PIVOT/UNPIVOT 子句对列的 ANSI 填充状态(SSMS 中的右键单击 -> 属性)以及类型、大小和排序规则敏感。在添加或重新创建相关列之前,尝试在会话中指定 SET ANSI_PADDING ON|OFF,以便它与 PIVOT/UNPIVOT 子句中的其他列匹配。
遇到了同样的错误,我只是让表中的所有列都具有相同的数据类型 - 我混合了int, varchar,nvarchar各种长度。一旦我将表中的所有列都转换为相同的类型 -nvarchar(255)它工作得很好。
| 归档时间: |
|
| 查看次数: |
48315 次 |
| 最近记录: |