Làm cách nào để nối văn bản trong một truy vấn trong máy chủ sql?


80

SQL sau:

SELECT notes + 'SomeText'
FROM NotesTable a 

Đưa ra lỗi:

Các kiểu dữ liệu nvarchar và văn bản không tương thích trong toán tử thêm.

Câu trả lời:


81

Cách duy nhất là chuyển đổi trường văn bản của bạn thành trường nvarchar.

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

Nếu không, tôi khuyên bạn nên thực hiện nối trong ứng dụng của mình.


Vì vậy, bạn đang đúc textlà một 4000 "khổng lồ" nvarcharđể đảm bảo rằng hầu hết mọi thứ sẽ phù hợp?
Matthieu

23

Bạn cũng có thể muốn xem xét các giá trị NULL. Trong ví dụ của bạn, nếu ghi chú cột có giá trị null, thì giá trị kết quả sẽ là NULL. Nếu bạn muốn các giá trị null hoạt động dưới dạng chuỗi trống (để câu trả lời xuất hiện là 'SomeText'), thì hãy sử dụng hàm IsNull:

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

21

Nếu bạn đang sử dụng SQL Server 2005 trở lên, tùy thuộc vào kích thước của dữ liệu trong trường Ghi chú, bạn có thể muốn xem xét truyền tới nvarchar (max) thay vì truyền đến một độ dài cụ thể có thể dẫn đến việc cắt ngắn chuỗi.

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

2
Đây phải là câu trả lời đúng. Nó tránh cắt ngắn văn bản.
billy

Nó có sử dụng nhiều bộ nhớ hơn hay bằng cách nào đó nó "tự động thích ứng" với kích thước nguồn?
Matthieu

6

Bạn phải ép kiểu rõ ràng các loại chuỗi giống nhau để nối chúng, Trong trường hợp của bạn, bạn có thể giải quyết vấn đề bằng cách thêm dấu 'N' vào trước 'SomeText' (N'SomeText '). Nếu điều đó không hiệu quả, hãy thử Cast ('SomeText' là nvarchar (8)).



2

Nếu bạn đang sử dụng SQL Server 2005 (hoặc cao hơn), bạn có thể muốn xem xét chuyển sang NVARCHAR (MAX) trong định nghĩa bảng của mình; Các kiểu dữ liệu TEXT, NTEXT và IMAGE của SQL Server 2000 sẽ không được dùng nữa trong các phiên bản SQL Server trong tương lai. SQL Server 2005 cung cấp khả năng tương thích ngược với các kiểu dữ liệu, nhưng có lẽ bạn nên sử dụng VARCHAR (MAX), NVARCHAR (MAX) và VARBINARY (MAX) để thay thế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.