一尘不染

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

sql

我有table

  • ID(PK)
  • Owner int
  • DescriptionText text

连接到另一个表

  • ID(FK)
  • Participant 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不会抛出

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

由于Id是PK,而Text是来自同一表,因此SQL Server为什么要完全比较Text?

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


阅读 580

收藏
2021-03-17

共1个答案

一尘不染

正确的方法

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

*在将来的Microsoft SQL Server版本中,将删除 *ntext,text和image
数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。
请改用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
2021-03-17