'CONCAT' không phải là tên hàm tích hợp được công nhận


24

Một khách hàng đã báo cáo rằng họ đang chạy trên SQL Server 2012 và chúng tôi đã gửi một số truy vấn kiểm tra để kiểm tra trước khi phân phối cuối cùng, tuy nhiên:

'CONCAT' không phải là tên hàm tích hợp được công nhận.

Tôi hiểu rằng đó CONCAT()là một hàm tích hợp mới được giới thiệu trong SQL Server 2012, tất cả đều ổn và tốt, tuy nhiên tôi đã được yêu cầu quay lại thay đổi của mình để làm cho 2008R2 này tương thích với chiêu bài "người dùng thực hiện truy vấn có thể không có quyền Transact-SQL để thực thi. " Vì vậy, tôi chỉ chứng minh quan điểm của mình rằng máy khách rất có thể có phiên bản SQL Server khác được cài đặt trong DEV so với phiên bản sản xuất.

Tôi không thể tìm thấy bất kỳ thông tin nào về việc từ chối cấp SELECT/EXECUTEphép cụ thể cho các hàm có giá trị vô hướng tích hợp, nhưng liệu có thể, và nếu vậy thì người dùng vẫn nhận được cùng một văn bản lỗi?


Nếu concat không hoạt động thì hãy thử cái nàySELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal Sethi

CONCAT hỗ trợ concat loại thập phân (ID + '_' + OtherID), ID có thể là kiểu int.
Zhang

Trong các phiên bản cũ hơn, hãy sử dụng điều này thay thế:DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Jack Whittaker

Câu trả lời:


21

CONCATđã được giới thiệu trong SQL Server 2012; không có cách nào để làm cho nó hoạt động trong SQL Server 2008 R2. Từ tài liệu :

nhập mô tả hình ảnh ở đây

Cũng không có cách nào để làm cho nó thất bại trong năm 2012+, ngay cả với mức độ tương thích. Vì vậy, có người của bạn kiểm tra SELECT @@VERSION;trên cả hai máy chủ; bạn sẽ thấy rằng CONCATnó không thành công <11. Để làm cho mã của bạn tương thích với các phiên bản trước đó, bạn sẽ cần sử dụng toán tử nối chuỗi tiêu chuẩn ( +). Tôi không biết bạn sẽ làm điều này như thế nào với hàm vô hướng, trừ khi bạn luôn sử dụng chính xác số chuỗi đầu vào bạn thay đổi mã để sử dụng dbo.CONCAT()thay vì CONCAT()(sẽ có kịch bản xảy ra, cộng với nếu hàm của bạn làm bất cứ điều gì người bản địa không làm, bạn muốn có hành vi nhất quán nếu / khi bạn nâng cấp). Vì vậy, tôi sẽ không đề nghị phương pháp đó. Bạn cũng có thể cần thêmNULL xử lý và các thay đổi nhỏ khác (không thể cho bạn biết cách thay đổi chính xác tập lệnh hiện tại của bạn, nếu chúng tôi không thể thấy nó).


Cảm ơn, Aaron. Mã này không quan trọng để thay đổi, vì CONCAT () chỉ được sử dụng để nối một số chuỗi với nhau trước một lệnh gọi SQL động SP_ExecuteQuery. Tôi thực sự chỉ muốn xác nhận rằng KHÔNG có cách nào để từ chối quyền truy cập bằng cách sử dụng CONCAT () trong SQL Server 2012
ong vào

1
@beeks Tôi không biết cách nào để từ chối người dùng khả năng sử dụng CONCAT(), không. Mặc dù vậy, tôi hoàn toàn không tuân theo những gì liên quan đến những gì bạn cần làm để làm cho mã hoạt động trên 2008 R2. Bạn cần loại bỏ CONCAT() , không thêm nó.
Aaron Bertrand

1
vâng, tôi hiểu làm thế nào để làm cho mã tương thích với 2008 R2, đó là chuyện nhỏ. Cảm ơn vì đã xác nhận rằng người ta không thể DENYtruy cập vào chức năng này.
ong

Chỉ cần lưu ý khi thay đổi concat thành + bạn sẽ cần đảm bảo các giá trị được nối là các chuỗi bắt đầu, nếu bạn có bất kỳ trường số nào, nó sẽ cố gắng thêm chúng (và thất bại vì một chuỗi không phải là int) có một trường số (loại) đảm bảo bạn chuyển đổi / chuyển nó thành chuỗi trước
Ste Bov

3

Bạn có thể sử dụng hàm ODBC CONCAT như thế này:

SELECT {fn CONCAT('foo ', 'test') }

Vấn đề với điều này là chức năng này chỉ cho phép bạn hai tham số cùng một lúc. Vì vậy, trừ khi bạn muốn sử dụng nhiều hơn hai như thế này:

SELECT {fn CONCAT('foo ', {fn CONCAT('test ', 'buddy')}) }

Bạn cũng có thể chỉ cần sử dụng toán tử '+'.

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.