【发布时间】:2021-09-29 04:54:28
【问题描述】:
需要帮助。我正在创建用于检查电子邮件服务器配置的 SQL 服务器单元测试,并且在使用 UNPIVOT 时我的行为很奇怪。以下代码在供应商数据库上运行时会引发错误,但在默认数据库(master、model、msdb、tempdb)中运行良好。有什么想法吗?
消息 8167,第 16 级,状态 1,第 16 行 “端口”列的类型与 UNPIVOT 列表中指定的其他列的类型冲突。
SELECT * FROM (
SELECT
CAST(p.name AS VARCHAR(256)) name,
CAST(a.email_address AS VARCHAR(256)) email_address,
CAST(a.display_name AS VARCHAR(256)) display_name,
CAST(a.replyto_address AS VARCHAR(256)) replyto_address,
CAST(s.servertype AS VARCHAR(256)) servertype,
CAST(s.servername AS VARCHAR(256)) servername,
CAST(s.port AS VARCHAR(256)) port
FROM msdb.dbo.sysmail_profile p
JOIN msdb.dbo.sysmail_profileaccount pa ON p.profile_id = pa.profile_id
JOIN msdb.dbo.sysmail_account a ON pa.account_id = a.account_id
JOIN msdb.dbo.sysmail_server s ON a.account_id = s.account_id
) AS dummyName1
UNPIVOT(
configValue for configKey IN (name, email_address, display_name, replyto_address, servertype, servername, port)
) as dummyName2
【问题讨论】:
-
如果您使用
VALUES表结构来反透视表,那么您会遇到同样的问题吗? -
供应商数据库的排序规则集可能与 msdb 数据库不同。其他列是 varchar,因此强制转换继承了现有的排序规则,但端口不是,因此它从命令上下文中获取默认排序规则。您可以通过在每列之后添加“COLLATE DATABASE_DEFAULT”来强制它们全部使用相同的排序规则。
标签: sql sql-server tsql unpivot