web-dev-qa-db-fra.com

Le texte du type de données ne peut pas être utilisé comme opérande pour les opérateurs UNION, INTERSECT ou EXCEPT car il n'est pas comparable

J'ai une table

  • Id (PK)
  • Propriétaire int
  • DescriptionTexte texte

qui est joint à une autre table

  • Id (FK)
  • Participant int

Le propriétaire peut être un participant, et si c'est le cas, la même référence (dans la table utilisateur) est dans le propriétaire et le participant. J'ai donc fait:

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

Cette requête doit renvoyer tous les ensembles de données distincts dans lesquels un certain @User est propriétaire ou participant, ou les deux.

Et ce serait le cas, si SQL Server ne jetait pas

Le texte du type de données ne peut pas être utilisé comme opérande pour les opérateurs UNION, INTERSECT ou EXCEPT car il n'est pas comparable.

Étant donné que Id est un PK et que le texte provient de la même table, pourquoi SQL Server voudrait-il comparer le texte?

Je peux utiliser UNION ALL pour arrêter la détection des doublons, mais puis-je contourner cela sans perdre la netteté des résultats?

15
Alexander

Façon correcte

Arrêtez d'utiliser TEXT c'est obsolète. Modifier le schéma de table.

Les types de données ntext, text et image seront supprimés dans une future version de Microsoft SQL Server. Évitez d'utiliser ces types de données dans de nouveaux travaux de développement et prévoyez de modifier les applications qui les utilisent actuellement. Utilisez plutôt nvarchar (max), varchar (max) et varbinary (max).

Solution

Convertir en 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