【问题标题】:The data type text cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable数据类型 text 不能用作 UNION、INTERSECT 或 EXCEPT 运算符的操作数,因为它不可比较
【发布时间】:2016-04-26 03:49:21
【问题描述】:

我有一张桌子

  • 标识(PK)
  • 所有者解释
  • 描述文本文本

连接到另一个表

  • Id (FK)
  • 参与者介绍

所有者可以是参与者,如果是,那么所有者和参与者中的相同引用(到用户表中)。所以我做了:

SELECT TableA.Id,TableA.Owner,TableA.Text
FROM TableA
WHERE TableA.Owner=@User
UNION
SELECT TableA.Id,TableA.Owner.TableA.Text
FROM TableA LEFT JOIN TableB ON (TableA.Id=TableB.Id)
WHERE TableB.Participant = @User

此查询应返回所有不同的数据集,其中某个 @User 是所有者或参与者或两者兼而有之。

如果 SQL Server 不抛出,它会的

数据类型文本不能用作 UNION、INTERSECT 或 EXCEPT 运算符的操作数,因为它不可比较。

既然 Id 是一个 PK,而 Text 来自同一个表,SQL Server 为什么要比较 Text 呢?

我可以使用UNION ALL 来停止重复检测,但是我可以在不丢失结果的独特性的情况下绕过它吗?

【问题讨论】:

  • 嘿,您的数据集是否不同?一张桌子只有一个所有者,并且只注册为参与者一次?

标签: sql sql-server tsql union


【解决方案1】:

正确方法

停止使用TEXT 它已过时。更改表架构。

ntext、text 和 image 数据类型将在未来版本中移除 的 Microsoft SQL Server。避免在 new 中使用这些数据类型 开发工作,并计划修改当前使用的应用程序 他们。 请改用 nvarchar(max)、varchar(max) 和 varbinary(max)。

解决方法

投射到NVARCHAR(MAX):

SELECT TableA.Id,TableA.Owner, CAST(TableA.DescriptionText AS NVARCHAR(MAX))
FROM TableA
WHERE TableA.Owner=@User
UNION
SELECT TableA.Id,TableA.Owner, CAST(TableA.DescriptionText AS NVARCHAR(MAX))
FROM TableA LEFT JOIN TableB ON (TableA.Id=TableB.Id)
WHERE TableB.Participant = @User

【讨论】:

  • 我已将架构切换为 nvarchar(max) 并且查询有效。感谢您指出 text 已过时。
  • 顺便说一句,推荐的数据类型与我应该注意的过时数据类型相比有什么缺点/缺点吗? nvarchar(MAX) 是否计入最大行大小,它们会影响索引或查询速度吗?
  • @Alexander 我会说更新的数据类型更好。 TEXT 仅因为向后兼容而可用。您应该在需要时使用MAX。例如,您的描述真的需要 2GB 文本吗?也许4000就足够了。 stackoverflow.com/questions/2133946/nvarcharmax-vs-ntext
  • 32K-64K 就足够了,但我认为 varchar 的数字不会超过 4000。
  • 太棒了。谢谢
猜你喜欢
  • 1970-01-01
  • 2022-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多