Як об’єднати текст у запиті на сервері sql?


80

Наступний SQL:

SELECT notes + 'SomeText'
FROM NotesTable a 

Вкажіть помилку:

Типи даних nvarchar і text несумісні в операторі додавання.

Відповіді:


81

Єдиним способом було б перетворити ваше текстове поле в поле nvarchar.

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

В іншому випадку я пропоную зробити об’єднання у вашій заявці.


Отже, ви кидаєте text"величезний" 4000, nvarcharщоб переконатися, що майже все вміститься?
Матьє

23

Ви також можете розглянути значення NULL. У вашому прикладі, якщо примітки до стовпців мають нульове значення, тоді отримане значення буде NULL. Якщо ви хочете, щоб нульові значення поводились як порожні рядки (щоб відповідь виходила "SomeText"), тоді використовуйте функцію IsNull:

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

21

Якщо ви використовуєте SQL Server 2005 або новішої версії, залежно від розміру даних у полі Примітки, ви можете розглянути можливість передачі в nvarchar (макс.) Замість передачі на певну довжину, що може призвести до усічення рядків.

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

2
Це повинна бути правильна відповідь. Це дозволяє уникнути скорочення тексту.
Біллі

Чи використовує він більше пам'яті, чи це якось "автоматично адаптується" до розміру джерела?
Matthieu

6

Вам потрібно явно привласнити типи рядків однакові, щоб об'єднати їх. У вашому випадку ви можете вирішити проблему, просто додавши 'N' перед 'SomeText' (N'SomeText '). Якщо це не працює, спробуйте Cast ('SomeText' як nvarchar (8)).



2

Якщо ви використовуєте SQL Server 2005 (або новішої версії), можливо, вам слід розглянути можливість переходу на NVARCHAR (MAX) у визначенні таблиці; Типи даних TEXT, NTEXT та IMAGE SQL Server 2000 буде застарілим у наступних версіях SQL Server. SQL Server 2005 забезпечує зворотну сумісність із типами даних, але, ймовірно, замість цього слід використовувати VARCHAR (MAX), NVARCHAR (MAX) та VARBINARY (MAX).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.