>我有一个表格
- 身份证 (PK)
- 所有者 int
- 说明文本文本
连接到另一个表
- 编号 (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
此查询应返回特定@User是所有者或参与者或两者的所有不同数据集。
如果SQL Server不会抛出
数据类型文本不能用作 UNION、INTERSECT 或 EXCEPT 运算符的操作数,因为它不具有可比性。
既然 Id 是 PK,而 Text 来自同一个表,为什么 SQL Server 要比较 Text呢?
我可以使用UNION ALL
来阻止重复检测,但我是否可以在不丢失结果的独特性的情况下绕过它?
正确的方法
停止使用TEXT
它已经过时了。更改表架构。
ntext、text 和 image 数据类型将在将来的版本中删除 的Microsoft SQL Server。避免在新的 开发工作,并计划修改当前使用的应用程序 他们。请改用 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