我有一张桌子
> Id(PK)
>所有者int
>说明文字
它连接到另一个表
> 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
此查询应返回所有不同的数据集,其中某个@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,CAST(TableA.DescriptionText AS NVARCHAR(MAX)) FROM TableA WHERE TableA.Owner=@User UNION SELECT TableA.Id,CAST(TableA.DescriptionText AS NVARCHAR(MAX)) FROM TableA LEFT JOIN TableB ON (TableA.Id=TableB.Id) WHERE TableB.Participant = @User