Làm cách nào để sử dụng hàm CONCAT trong SQL Server 2008 R2?


102

Tôi đang tìm kiếm một CONCAThàm trong SQL Server 2008 R2. Tôi đã tìm thấy liên kết cho chức năng này . Nhưng khi tôi sử dụng chức năng này, nó xuất hiện lỗi sau:

Msg 195, Mức 15, Trạng thái 10, Dòng 7
'CONCAT' không phải là tên hàm tích hợp sẵn được công nhận.

Liệu các CONCATchức năng tồn tại trong SQL Server 2008 R2?

Nếu không, làm cách nào để nối các chuỗi trong SQL Server 2008 R2?


@Oded Tôi chỉ cố gắng thực hiện stmt - chọn concat ('b', 'a')
Mitesh Budhabhatti

1
@marc_s: Các tài liệu có một số dấu hiệu cho thấy đó là cho SQL Server 2012, nhưng không có dấu hiệu cho thấy CONCATmới cho năm 2012.
Gabe

1
Nó gián tiếp chỉ ra rằng nó dành cho năm 2012, nhưng trang này có thiết kế giao diện người dùng kém. Trên các trang có sẵn chức năng trong các phiên bản cũ hơn, có một menu thả xuống ngay bên cạnh phiên bản của tài liệu mà bạn đang đọc. Nếu bạn biết điều này, thì bạn biết rằng nó chỉ dành cho năm 2012. Nếu bạn không biết điều đó, bạn sẽ rơi vào tình huống giống như Mitesh.
John

Câu trả lời:


70

CONCATlà mới đối với SQL Server 2012. Liên kết bạn cung cấp làm rõ điều này, nó không phải là một chức năng trên các Phiên bản trước , bao gồm 2008 R2.

Đó là một phần của SQL Server 2012 có thể được nhìn thấy trong cây tài liệu:

SQL Server 2012  
Product Documentation  
Books Online for SQL Server 2012  
Database Engine  
  Transact-SQL Reference (Database Engine)  
    Built-in Functions (Transact-SQL)  
      String Functions (Transact-SQL)  

CHỈNH SỬA Martin Smith hữu ích chỉ ra rằng SQL Server cung cấp việc triển khai CONCATchức năng của ODBC .


26
Bạn có thể sử dụng SELECT {fn concat ('foo', 'bar')};trong các phiên bản trước. Tuy nhiên, chỉ chấp nhận 2 tham số.
Martin Smith,

6
Hoặc chỉ cần sử dụng +toán tử, như @ lynn-langit đề cập trong câu trả lời của cô ấy, mà lúc đầu tôi hoàn toàn bỏ lỡ vì tôi chỉ đọc câu trả lời được chấp nhận ...
Svish

7
@Svish +xử lý khác nhau, kết quả cho SELECT 'A' + 'B' + 'C'vs SELECT CONCAT('A', 'B', 'C')vs SELECT 'A' + 'B' + NULLvs SELECT CONCAT('A', 'B', NULL)ABC, ABC, NULL,AB
ta.speot.is

@ ta.speot.is Thật tốt khi biết! Mặc dù trong trường hợp của tôi không có trường hợp nào NULL, vì vậy +đã hoạt động tuyệt vời :)
Svish

Câu trả lời này sẽ hữu ích hơn nhiều nếu nó chứa thông tin mà bạn phải sử dụng dấu cộng để thay thế. Cộng đồng xác nhận ý kiến ​​đó - so sánh số phiếu ủng hộ cho câu trả lời của @ LynnLangit :) OP cũng hỏi "làm cách nào để nối các chuỗi trong SQL Server 2008 R2?"
Honza Zidek

101

Chỉ để hoàn chỉnh - trong SQL 2008, bạn sẽ sử dụng +toán tử dấu cộng để thực hiện nối chuỗi.

Hãy xem tham chiếu MSDN với mã mẫu. Bắt đầu với SQL 2012, bạn có thể muốn sử dụng hàm CONCAT mới .


46

Tôi khuyên bạn nên truyền tất cả các cột trước khi nối chúng

cast('data1' as varchar) + cast('data2' as varchar) + cast('data3' as varchar)

Điều này sẽ làm việc cho bạn.


6
MẸO: Cần lưu ý rằng nếu kích thước varchar không được chỉ định, ví dụ: varchar (50), thì sql sẽ sử dụng giá trị mặc định là 30. Nếu biến / giá trị được ép nhiều hơn giá trị mặc định, nó sẽ bị cắt bớt mà không gây ra lỗi.
Swifty

23

CONCAT, như đã nêu, không được hỗ trợ trước SQL Server 2012. Tuy nhiên, bạn có thể nối đơn giản bằng cách sử dụng toán tử + như được đề xuất. Nhưng hãy cẩn thận, toán tử này sẽ gây ra lỗi nếu toán hạng đầu tiên là một số vì nó cho rằng sẽ thêm và không nối. Để giải quyết vấn đề này, chỉ cần thêm '' vào phía trước. Ví dụ

someNumber + 'someString' + .... + lastVariableToConcatenate

sẽ phát sinh lỗi NHƯNG '' + someNumber + 'someString' + ......sẽ hoạt động tốt.

Ngoài ra, nếu có hai số được nối, hãy đảm bảo bạn thêm dấu '' vào giữa chúng, như vậy

.... + someNumber + '' + someOtherNumber + .....

Cảm ơn, sử dụng '' + f.columnName + '' trong danh sách cột rất hữu ích!
Luke

2
@kuklei Trên máy chủ SQL của tôi, SELECT 'varchar(' + 5 + ')'ném lỗi "Chuyển đổi không thành công khi chuyển đổi giá trị nvarchar 'varchar (' thành kiểu dữ liệu int", vì vậy tôi đoán câu trả lời của bạn không đúng.
Alexander

5

NULL giảm an toàn trong các ước lượng thay thế cho hàm CONCAT của SQL Server 2012

SQL Server 2012 :

SELECT CONCAT(data1, data2)

PRE SQL 2012 (Hai giải pháp) :

SELECT {fn CONCAT(ISNULL(data1, ''), ISNULL(data2, ''))}

SELECT ISNULL(CAST(data1 AS varchar(MAX)), '') + ISNULL(CAST(data2 AS varchar(MAX)), '')

Hai giải pháp này đối chiếu với một số câu trả lời xuất sắc và cảnh báo được đưa ra bởi các áp phích khác bao gồm @Martin Smith, @Svish và @ vasin1987.

Các tùy chọn này thêm NULLvào ''(chuỗi trống) ép kiểu để NULLxử lý an toàn trong khi tính đến các hành vi khác nhau của +toán tử liên quan đến các toán hạng cụ thể.

Lưu ý rằng giải pháp Hàm Scaler ODBC được giới hạn ở 2 đối số trong khi cách tiếp cận +toán tử có thể mở rộng thành nhiều đối số khi cần.

Cũng xin lưu ý rằng vấn đề tiềm ẩn được @Swifty xác định liên quan đến varcharkích thước mặc định đã được khắc phục ở đây varchar(MAX).


3
(city + ', ' + state + ' ' + zip) as ctstzip for select
(city + ', ' + state + ' ' + zip) for insert

Chỉ ép kiểu hoặc chuyển đổi nếu bất kỳ loại trường nào khác với các loại trường khác.

Khi chèn, giá trị cần phải ở đúng vị trí mà bạn cần. Sử dụng "as" sẽ cho bạn một lỗi.

I E

Insert into testtable (ctstzip) Values ((city + ', ' + state + ' ' + zip))

2

Có, chức năng này không có trong sql 2008. Bạn có thể sử dụng thao tác ép kiểu để thực hiện điều đó.

Ví dụ, chúng tôi có employeebảng và bạn muốn namevới applydate.

vì vậy bạn có thể sử dụng

Select   cast(name as varchar) + cast(applydate as varchar) from employee

Nó sẽ hoạt động khi hàm concat không hoạt động.

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.