2016-01-20 13 views
11

Ho una tabellaIl testo tipo di dati non può essere utilizzato come operando alla UNION, INTERSECT o EXCEPT operatori perché non è paragonabile

  • Id (PK)
  • proprietario int testo
  • DescriptionText

che è unita ad un'altra tabella

  • Id (FK)
  • partecipante int

il proprietario può essere un partecipante, e se lo è, lo stesso riferimento (in tabella utente) è proprietario e partecipante. Così ho fatto:

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 

Questa query deve restituire tutti i set di dati distinti in cui un determinato utente @ è proprietario o partecipante o entrambi.

E sarebbe, se SQL Server non sarebbe buttare

Il testo tipo di dati non può essere utilizzato come operando al UNION, INTERSECT o EXCEPT operatori perché non è comparabile.

Poiché Id è un PK e Testo proviene dalla stessa tabella, perché SQL Server desidera confrontare il testo?

Posso usare UNION ALL per arrestare il rilevamento dei duplicati, ma posso eludere ciò senza perdere la nitidezza dei risultati?

+0

Ehi, è l'insieme di dati distinto altrimenti? Solo un proprietario di un tavolo e registrato una sola volta come partecipante? –

risposta

19

modo corretto

Smettere di usare TEXT è obsoleto. Modificare lo schema della tabella.

ntext, testo e immagine tipi di dati verranno rimosse in una futura versione di di Microsoft SQL Server. Evitare l'uso di questi tipi di dati nel nuovo lavoro di sviluppo e pianificare la modifica delle applicazioni che attualmente utilizzano . Utilizzare invece nvarchar (max), varchar (max) e varbinary (max).

Soluzione

Fusioni a 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 
+1

Ho cambiato lo schema in 'nvarchar (max)' e la query funziona. Grazie per aver sottolineato che 'text' è obsoleto. – Alexander

+0

A proposito, c'è qualche svantaggio/svantaggio dei tipi di dati raccomandati rispetto a quelli obsoleti di cui dovrei essere a conoscenza? Il conteggio di nvarchar (MAX) verso la dimensione massima della riga influisce sull'indicizzazione o sulla velocità della query? – Alexander

+0

@Alexander Direi che i nuovi tipi di dati sono migliori.'TEXT' è disponibile solo per compatibilità con le versioni precedenti. Dovresti usare 'MAX' quando è necessario. Ad esempio, la tua descrizione ha davvero bisogno di un testo da 2 GB? Forse 4000 sarà assolutamente sufficiente. http://stackoverflow.com/questions/2133946/nvarcharmax-vs-ntext – lad2025