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

Ale*_*der 15 sql t-sql sql-server union

我有一张桌子

  • Id(PK)
  • 所有者int
  • DescriptionText文本

它连接到另一个表

  • Id(FK)
  • 参与者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
Run Code Online (Sandbox Code Playgroud)

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

如果SQL Server不抛出,它会

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

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

我可以UNION ALL用来阻止重复检测,但是我可以绕过这一点而不会失去结果的清晰度吗?

Luk*_*zda 31

正确的方式

停止使用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
Run Code Online (Sandbox Code Playgroud)