web-dev-qa-db-ja.com

データ型textは、比較できないため、UNION、INTERSECT、またはEXCEPT演算子のオペランドとして使用できません。

テーブルがあります

  • 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がスローしない場合

データ型textは、比較できないため、UNION、INTERSECT、またはEXCEPT演算子のオペランドとして使用できません。

IdはPKであり、Textは同じテーブルからのものであるため、SQL ServerがTextをまったく比較したくないのはなぜですか?

使うことができます UNION ALL重複検出を停止しますが、結果の明確性を失うことなくこれを回避できますか?

15
Alexander

正しい方法

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
31
Lukasz Szozda