2016-01-20 29 views
11

Mam tabeliTekst typu dane nie mogą być wykorzystywane jako argument do Unii przecinają lub OPRÓCZ operatorów, ponieważ nie jest porównywalna

  • Id (PK)
  • Właściciel int tekst
  • descriptionText

który jest dołączony do innej tabeli

  • Id (FK)
  • Uczestnik int

właściciel może być uczestnikiem, a jeśli jest, to samo odniesienie (w tabeli użytkownika) jest właścicielem i uczestnika. Więc zrobiłem:

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 

To zapytanie należy zwrócić wszystkie różne zestawy danych, gdzie pewna @User jest albo Właściciel lub Uczestnik lub oba.

I byłoby, gdyby SQL Server nie rzucać

Tekst typu dane nie mogą być wykorzystywane jako argument do Unii przecinają lub OPRÓCZ operatorów, ponieważ nie jest porównywalna.

Ponieważ identyfikator to PK, a tekst pochodzi z tej samej tabeli, dlaczego SQL Server chciałby w ogóle porównać tekst?

Mogę użyć UNION ALL, aby zatrzymać wykrywanie duplikatów, ale czy mogę to obejść bez utraty odrębności wyników?

+0

Hej, to zbiór danych wyraźny inaczej? Tylko jeden właściciel stołu i zarejestrowany jako uczestnik tylko raz. –

Odpowiedz

19

Prawidłowy sposób

Zatrzymaj użyciu TEXT jest nieaktualne. Zmień schemat tabeli.

ntext, tekst i obraz typy danych zostaną usunięte w przyszłej wersji Microsoft SQL Server. Unikaj używania tych typów danych w nowych pracach rozwojowych i planuj modyfikacje aplikacji, które obecnie używają . Zamiast tego należy użyć nvarchar (max), varchar (max) i varbinary (max).

Obejście

Odlewanie do 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

Zmieniłem schemat na 'nvarchar (max)' i zapytanie działa. Dziękuję za zwrócenie uwagi, że "tekst" jest przestarzały. – Alexander

+0

Nawiasem mówiąc, czy jest jakaś wada/wada zalecanych typów danych w stosunku do przestarzałych, o których powinienem wiedzieć? Czy nvarchar (MAX) licząc do maksymalnego rozmiaru wiersza ma wpływ na indeksowanie lub prędkość zapytania? – Alexander

+0

@Alexander Powiedziałbym, że nowsze typy danych są lepsze."TEKST" jest dostępny tylko z powodu kompatybilności wstecznej. Powinieneś użyć 'MAX' kiedy jest to potrzebne. Na przykład czy twój opis naprawdę wymaga 2GB tekstu? Może 4000 będzie absolutnie wystarczające. http://stackoverflow.com/questions/2133946/nvarcharmax-vs-ntext – lad2025