Jak połączyć tekst w kwerendzie na serwerze sql?

80

Następujący SQL:

SELECT notes + 'SomeText'
FROM NotesTable a 

Podaj błąd:

Typy danych nvarchar i text są niezgodne w operatorze dodawania.

Greg Ogle
źródło

Odpowiedzi:

81

Jedynym sposobem byłoby przekonwertowanie pola tekstowego na pole nvarchar.

Select Cast(notes as nvarchar(4000)) + 'SomeText'
From NotesTable a

W przeciwnym razie sugeruję wykonanie konkatenacji w Twojej aplikacji.

GateKiller
źródło
Więc rzucasz textjako „ogromne” 4000, nvarcharaby upewnić się, że prawie wszystko będzie pasować?
Matthieu
23

Możesz również rozważyć wartości NULL. W twoim przykładzie, jeśli notatki do kolumny mają wartość null, wynikowa wartość będzie równa NULL. Jeśli chcesz, aby wartości null zachowywały się jak puste ciągi (tak, że odpowiedź brzmi „SomeText”), użyj funkcji IsNull:

Select IsNull(Cast(notes as nvarchar(4000)),'') + 'SomeText' From NotesTable a
Chris Wuestefeld
źródło
21

Jeśli używasz SQL Server 2005 lub nowszego, w zależności od rozmiaru danych w polu Uwagi, możesz rozważyć rzutowanie na nvarchar (max) zamiast rzutowania na określoną długość, co może spowodować obcięcie ciągu.

Select Cast(notes as nvarchar(max)) + 'SomeText' From NotesTable a
Scott Nichols
źródło
2
To powinna być właściwa odpowiedź. Pozwala uniknąć obcinania tekstu.
billy
Czy zużywa więcej pamięci, czy w jakiś sposób „automatycznie dostosowuje się” do rozmiaru źródła?
Matthieu
6

Musisz jawnie rzutować typy ciągów na te same, aby je połączyć. W twoim przypadku możesz rozwiązać problem, po prostu dodając „N” przed „SomeText” (N'SomeText '). Jeśli to nie zadziała, spróbuj Cast ('SomeText' jako nvarchar (8)).

Craig
źródło
4

Inną opcją jest polecenie CONCAT :

SELECT CONCAT(MyTable.TextColumn, 'Text') FROM MyTable
David Gausmann
źródło
2

Jeśli używasz SQL Server 2005 (lub nowszego), możesz rozważyć przejście na NVARCHAR (MAX) w definicji tabeli; Typy danych TEXT, NTEXT i IMAGE programu SQL Server 2000 zostaną wycofane w przyszłych wersjach programu SQL Server. SQL Server 2005 zapewnia wsteczną kompatybilność z typami danych, ale prawdopodobnie powinieneś używać zamiast tego VARCHAR (MAX), NVARCHAR (MAX) i VARBINARY (MAX).

edosoft
źródło