sql - 数据类型 text 不能用作 UNION、INTERSECT 或 EXCEPT 运算符的操作数,因为它不具有可比性

标签 sql sql-server tsql union

我有一张 table

  • ID(PK)
  • 所有者整数
  • DescriptionText 文本

连接到另一个表

  • 身份证件(外籍)
  • 参与者int

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

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 不抛出异常,它就会发生

The data type text cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.

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

我可以使用UNION ALL来停止重复检测,但是我可以在不丢失结果清晰度的情况下规避这个问题吗?

最佳答案

正确方法

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

ntext, text, and image data types will be removed in a future version of Microsoft SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.

解决方法

转换为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

关于sql - 数据类型 text 不能用作 UNION、INTERSECT 或 EXCEPT 运算符的操作数,因为它不具有可比性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34897677/

相关文章:

同表中记录的 MySQL 连接类型

mysql - 复制表行,但使用另一个值

c# - 处理大型查询的超时

sql-server - 从一个表中选择 ID 列表并从 SQL Server 中的第二个表中删除所有 ID

从两个 Select 语句返回重叠的 SQL 语句

sql - 在 PowerBI DAX 中使用 RANKX

mysql - INSERT INTO 其中某些数据依赖于选择

c# - C# 如何获取更新记录的ID

sql - 在 T-SQL 中有任何理由使用数字而不是 int 吗?

sql-server - 指示一个或多个记录存在于单独表中的 T-SQL 列