'CONCAT' bukan nama fungsi bawaan yang diakui

24

Seorang klien melaporkan bahwa mereka berjalan pada SQL Server 2012, dan kami mengirimkan beberapa pertanyaan pengujian untuk pengujian sebelum pengiriman akhir, namun:

'CONCAT' bukan nama fungsi bawaan yang diakui.

Saya mengerti bahwa CONCAT()ini adalah fungsi bawaan baru yang diperkenalkan dalam SQL Server 2012, yang semuanya baik-baik saja, namun saya telah diminta untuk mengembalikan perubahan saya untuk membuat 2008R2 ini kompatibel dengan kedok "pengguna yang menjalankan kueri mungkin tidak memiliki izin Transact-SQL untuk dieksekusi. " Jadi saya hanya membuktikan maksud saya bahwa klien kemungkinan besar memiliki versi SQL Server berbeda yang diinstal di DEV daripada yang mereka lakukan di PROD.

Saya tidak dapat menemukan informasi tentang penolakan SELECT/EXECUTEizin khusus untuk fungsi bernilai skalar bawaan, tetapi apakah itu mungkin, dan jika demikian apakah pengguna masih menerima teks kesalahan yang sama?

lebah
sumber
Jika concat tidak berfungsi, coba yang iniSELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal Sethi
CONCAT mendukung concat tipe desimal (ID + '_' + OtherID), ID dapat berupa tipe int.
Zhang
Dalam versi yang lebih lama, gunakan ini sebagai gantinya:DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Jack Whittaker

Jawaban:

21

CONCATdiperkenalkan di SQL Server 2012; tidak ada cara untuk membuatnya bekerja di SQL Server 2008 R2. Dari dokumentasi :

masukkan deskripsi gambar di sini

Juga tidak ada cara untuk membuatnya gagal di 2012+, bahkan dengan tingkat kompatibilitas. Jadi mintalah orang-orang Anda memeriksa SELECT @@VERSION;kedua server; Anda akan menemukan bahwa di mana CONCATkegagalannya adalah <11. Untuk membuat kode Anda kompatibel dengan versi sebelumnya, Anda harus menggunakan operator penggabung string standar ( +). Saya tidak tahu bagaimana Anda akan melakukan ini dengan fungsi skalar, kecuali jika Anda selalu menggunakan jumlah string input yang sama persis dan Anda mengubah kode Anda untuk digunakan dbo.CONCAT()sebagai gantinya CONCAT()(akan ada skenario di mana itu penting, ditambah jika fungsi Anda melakukan apa pun yang asli tidak melakukannya, Anda ingin perilaku yang konsisten jika / ketika Anda meningkatkan). Jadi saya tidak akan merekomendasikan pendekatan itu. Anda mungkin juga perlu menambahkanNULL penanganan dan perubahan kecil lainnya (tidak mungkin memberi tahu Anda cara mengubah skrip yang ada dengan tepat, jika kami tidak dapat melihatnya).

Aaron Bertrand
sumber
Terima kasih, Aaron. Kode ini sepele untuk diubah, karena CONCAT () hanya digunakan untuk menggabungkan beberapa string sebelum panggilan SQL dinamis SP_ExecuteSQL. Saya benar-benar hanya ingin mengkonfirmasi bahwa tidak ada cara untuk menolak akses untuk menggunakan CONCAT () di SQL Server 2012
beeks
1
@beeks Saya tidak tahu cara untuk menyangkal kemampuan pengguna untuk menggunakan CONCAT(), tidak. Saya tidak cukup mengikuti apa yang ada pada apa yang perlu Anda lakukan untuk membuat kode bekerja pada 2008 R2. Anda harus menghapus CONCAT() , bukan menambahkannya.
Aaron Bertrand
1
ya, saya mengerti bagaimana membuat kode yang kompatibel dengan 2008 R2, itu sepele. Terima kasih telah mengonfirmasi bahwa seseorang tidak dapat DENYmengakses fungsi ini.
beeks
Hanya untuk mencatat ketika mengubah concat ke + Anda harus memastikan nilai yang sedang digabungkan adalah string untuk memulai, jika Anda memiliki bidang numerik, ia akan mencoba menambahkannya (dan gagal karena string bukan int) jadi jika ada bidang numerik (tipe) pastikan Anda mengonversi / melemparkannya ke string terlebih dahulu
Ste Bov
3

Anda dapat menggunakan fungsi ODBC CONCAT seperti ini:

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

Masalah dengan ini adalah bahwa fungsi ini hanya memungkinkan Anda dua parameter sekaligus. Jadi kecuali Anda ingin menggunakan lebih dari dua seperti ini:

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

Anda mungkin juga cukup menggunakan operator '+'.

bfs
sumber