'CONCAT' ไม่ใช่ชื่อฟังก์ชันในตัวที่ได้รับการยอมรับ


24

ลูกค้ารายงานว่าพวกเขากำลังทำงานบน SQL Server 2012 และเราได้ส่งแบบสอบถามทดสอบสำหรับการทดสอบก่อนส่งมอบครั้งสุดท้ายอย่างไรก็ตาม:

'CONCAT' ไม่ใช่ชื่อฟังก์ชันในตัวที่ได้รับการยอมรับ

ฉันเข้าใจว่าCONCAT()เป็นฟังก์ชันในตัวใหม่ที่นำมาใช้ใน SQL Server 2012 ซึ่งดีและดี แต่ฉันถูกขอให้ย้อนกลับการเปลี่ยนแปลงของฉันเพื่อให้ 2008R2 นี้เข้ากันได้ภายใต้หน้ากากของ "ผู้ใช้ที่ดำเนินการแบบสอบถามอาจไม่ มีสิทธิ์ Transact-SQL ในการดำเนินการ " ดังนั้นฉันแค่พิสูจน์จุดของฉันว่าไคลเอนต์ส่วนใหญ่มี SQL Server รุ่นอื่นติดตั้งใน DEV มากกว่าที่พวกเขาทำใน PROD

ฉันไม่สามารถหาข้อมูลใด ๆ เกี่ยวกับการปฏิเสธการSELECT/EXECUTEอนุญาตโดยเฉพาะสำหรับฟังก์ชั่นที่มีมูลค่าสเกลาร์ในตัว แต่เป็นไปได้และถ้าเป็นเช่นนั้นผู้ใช้จะยังได้รับข้อความแสดงข้อผิดพลาดเดียวกันหรือไม่


ถ้า concat ไม่ทำงานให้ลองอันนี้SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal Sethi

CONCAT รองรับประเภททศนิยม concat (ID + '_' + OtherID), ID สามารถเป็นประเภท int
จาง

ในรุ่นเก่าใช้สิ่งนี้แทน:DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Jack Whittaker

คำตอบ:


21

CONCATเปิดตัวใน SQL Server 2012 ไม่มีวิธีที่จะทำให้ทำงานใน SQL Server 2008 R2 จากเอกสาร :

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้ยังไม่มีวิธีที่จะทำให้มันล้มเหลวในปี 2012 หรือแม้กระทั่งระดับความเข้ากันได้ ให้คนของคุณตรวจสอบSELECT @@VERSION;เซิร์ฟเวอร์ทั้งสอง คุณจะพบว่าที่ใดที่CONCATล้มเหลวคือ <11 ในการทำให้โค้ดของคุณใช้งานร่วมกับเวอร์ชันก่อนหน้านี้ได้คุณจะต้องใช้ตัวดำเนินการต่อสตริงมาตรฐาน ( +) ผมไม่ทราบว่าคุณจะทำเช่นนี้กับฟังก์ชั่นสเกลาเว้นแต่คุณจะใช้เสมอแน่นอนหมายเลขเดียวกันของสายการป้อนข้อมูลและคุณเปลี่ยนรหัสของคุณที่จะใช้dbo.CONCAT()แทนCONCAT()(จะมีสถานการณ์ที่มันเป็นเรื่องสำคัญบวกถ้าการทำงานของคุณได้ทำอะไรเลย ดั้งเดิมไม่ได้ทำคุณต้องการพฤติกรรมที่สอดคล้องกันหาก / เมื่อคุณอัพเกรด) ดังนั้นฉันจะไม่แนะนำวิธีการนั้น คุณอาจต้องเพิ่มNULL การจัดการและการเปลี่ยนแปลงเล็กน้อยอื่น ๆ (เป็นไปไม่ได้ที่จะบอกวิธีเปลี่ยนสคริปต์ที่มีอยู่ของคุณอย่างแน่นอนหากเรามองไม่เห็น)


ขอบคุณแอรอน รหัสมีการเปลี่ยนแปลงเล็กน้อยเนื่องจาก CONCAT () ถูกใช้เพื่อรวมสตริงเข้าด้วยกันก่อนการเรียก SQL แบบไดนามิก SP_ExecuteSQL ฉันแค่อยากจะยืนยันว่าไม่มีทางที่จะปฏิเสธการเข้าถึงการใช้ CONCAT () ใน SQL Server 2012
beeks

1
@beeks ฉันไม่รู้วิธีใด ๆ ที่จะปฏิเสธความสามารถในการใช้ของผู้ใช้CONCAT()ไม่ใช่ ฉันไม่ได้ค่อนข้างปฏิบัติตามสิ่งที่มีในสิ่งที่คุณต้องทำเพื่อให้รหัสทำงานใน 2008 R2 แม้ว่า คุณต้องลบ CONCAT()ไม่เพิ่ม
Aaron Bertrand

1
ใช่ฉันเข้าใจวิธีการทำให้โค้ดเข้ากันได้กับ 2008 R2 นั่นเป็นเรื่องเล็กน้อย ขอบคุณที่ยืนยันว่าไม่มีใครสามารถDENYเข้าถึงฟังก์ชั่นนี้
beeks

เพียงแค่ต้องทราบเมื่อเปลี่ยน concat เป็น + คุณจะต้องตรวจสอบให้แน่ใจว่าค่าที่ถูกต่อกันเป็นสตริงที่จะเริ่มต้นด้วยถ้าคุณมีเขตข้อมูลตัวเลขใด ๆ ก็จะพยายามที่จะเพิ่มพวกเขา (และล้มเหลวเพราะสตริงไม่ int) มีฟิลด์เป็นตัวเลข (ชนิด) ตรวจสอบให้แน่ใจว่าคุณแปลง / แปลงเป็นสตริงก่อน
Ste Bov

3

คุณสามารถใช้ฟังก์ชัน ODBC CONCAT ดังนี้:

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

ปัญหานี้คือว่าฟังก์ชั่นนี้ช่วยให้คุณสองพารามิเตอร์ในเวลาเดียว ดังนั้นถ้าคุณไม่ต้องการใช้มากกว่าสองแบบนี้:

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

คุณอาจใช้ตัวดำเนินการ '+' เช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.