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

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

我有一个table

连接到另一个 table

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

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

此查询应该 return 所有不同的数据集,其中某个 @User 是所有者或参与者或两者。

如果 SQL 服务器不抛出

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 来自同一个 table,为什么 SQL 服务器要比较 Text?

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

正确的方法

停止使用 TEXT 它已过时。改变 table 架构。

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