2012-05-11 40 views
84

Tôi đang tìm kiếm một hàm CONCAT trong SQL Server 2008 R2. Tôi found the link for this function. Nhưng khi tôi sử dụng chức năng này, nó cung cấp lỗi sau:Làm cách nào để sử dụng hàm CONCAT trong SQL Server 2008 R2?

Msg 195, Level 15, State 10, Line 7
'CONCAT' is not a recognized built-in function name.

Chức năng CONCAT có tồn tại trong SQL Server 2008 R2 không?

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

+0

@Oded Tôi chỉ cố gắng thực thi lệnh stmt - select concat ('b', 'a') –

+0

@marc_s: Tài liệu này có một số dấu hiệu cho biết đó là SQL Server 2012, nhưng không có dấu hiệu nào cho thấy 'CONCAT' * mới * cho năm 2012. – Gabe

+1

Nó gián tiếp chỉ ra rằng đó là cho năm 2012, nhưng trang là thiết kế giao diện người dùng kém. Trên các trang có chức năng IS trong các phiên bản cũ hơn, có một trình đơn thả xuống trực tiếp bên cạnh phiên bản của tài liệu 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ẽ kết thúc trong tình huống tương tự như Mitesh. – John

Trả lời

61

CONCAT là mới đối với SQL Server 2012. Liên kết mà bạn đã cung cấp thực hiện điều này rõ ràng, nó không phải là chức năng trên 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) 

EDIT Martin Smith helpfully chỉ ra rằng SQL Server provides an implementation of ODBC's CONCAT function.

+21

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

+5

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

+3

@Svish '+' hoạt động khác nhau, kết quả cho 'SELECT 'A' + 'B' + 'C'' và 'CHỌN CONCAT (' A ',' B ',' C ')' vs 'CHỌN' A '+' B '+ NULL' và' CHỌN CONCAT (' A ',' B ', NULL) 'là' ABC', 'ABC',' NULL', 'AB' –

92

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

Hãy xem MSDN reference bằng mã mẫu. Bắt đầu với SQL 2012, bạn có thể sử dụng CONCAT function mới.

21

CONCAT, như đã nêu, không được hỗ trợ trước SQL Server 2012. Tuy nhiên, bạn có thể ghép 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ẽ ném một 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 '' ở phía trước. Ví dụ:

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

sẽ báo lỗi BUT '' + someNumber + 'someString' + ...... sẽ hoạt động tốt.

Ngoài ra, nếu có hai số điện thoại để được nối chắc chắn rằng bạn thêm một '' giữa chúng, như vậy

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

Cảm ơn, bằng cách sử dụng '' + f.columnName + '' trong danh sách cột hoạt động một điều trị! – 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 – Alexander

34

Tôi đề nghị bạn cast tất cả các cột trước khi bạn concat họ

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

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

+2

MIPO: 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ị đang truyền lớn hơn giá trị mặc định, nó sẽ bị cắt bớt mà không tăng một lỗi. – Swifty

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

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

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

tức là

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

NULL thả an toàn trong xấp xỉ thay thế cho SQL Server 2012 CONCAT chức năng

SQL Server 2012:

SELECT CONCAT(data1, data2)

PRE SQL 2012 (Hai Solutions):

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 đối chiếu vài câu trả lời tuyệt vời và hãy cẩn thận nêu ra bởi áp phích khác bao gồm @ Martin Smith, @Svish và @ vasin1987.

Các tùy chọn này thêm NULL vào '' (chuỗi rỗng) để xử lý an toàn NULL trong khi tính toán hành vi khác nhau của toán hạng + liên quan đến toán hạng cụ thể.

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

Cũng lưu ý vấn đề tiềm năng được xác định bởi @Swifty về mặc định là varchar kích thước tại đây được khắc phục bởi varchar(MAX).

Các vấn đề liên quan