J'ai une table
qui est joint à une autre table
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?
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