Текст типа данных не может использоваться в качестве операнда для операторов UNION, INTERSECT или EXCEPT, поскольку он не сопоставим

У меня есть таблица

  • Id (PK)
  • Владелец int
  • ОписаниеText text

который соединен с другой таблицей

  • Id (FK)
  • Участник int

Владелец может быть Участником, и если это так, то одна и та же ссылка (в таблице пользователя) принадлежит Владельцу и Участнику. Итак, я сделал:

SELECT TableA.Id,TableA.Owner,TableA.Text
FROM TableA
WHERE [email protected]
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 вообще хочет сравнить текст?

Я могу использовать UNION ALL, чтобы остановить повторное обнаружение, но могу ли я обойти это без потери четкости результатов?

Ответ 1

Правильный способ

Остановить использование TEXT, он устарел. Изменить схему таблицы.

текстовые, текстовые и графические типы данных будут удалены в будущей версии 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 [email protected]
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