it-swarm.asia

لا يُعد 'CONCAT' اسم دالة مضمنة معترف بها

أبلغ أحد العملاء عن تشغيله على SQL Server 2012 ، وقمنا بتسليم بعض استعلامات الاختبار للاختبار قبل التسليم النهائي ، ولكن:

لا يُعد 'CONCAT' اسم دالة مضمنة معترف بها.

أفهم أن CONCAT() هي وظيفة مضمنة جديدة تم تقديمها في SQL Server 2012 ، وكلها جيدة وجيدة ، ولكن طُلب مني التراجع عن التغيير الذي أجريته لجعل 2008R2 متوافقًا تحت ستار " قد لا يكون لدى المستخدم الذي يقوم بتنفيذ الاستعلام أذونات Transact-SQL للتنفيذ. " لذلك أنا فقط أثبت وجهة نظري أن العميل على الأرجح لديه نسخة مختلفة من SQL Server مثبتة في DEV عن تلك الموجودة في PROD.

لا يمكنني العثور على أي معلومات حول رفض أذونات SELECT/EXECUTE على وجه التحديد للوظائف المضمنة ذات القيمة العددية ، ولكن هل هذا ممكن ، وإذا كان الأمر كذلك ، فهل لا يزال المستخدم يتلقى نص الخطأ نفسه؟

27
beeks

CONCAT تم تقديمه في SQL Server 2012 ؛ لا توجد طريقة لجعله يعمل في SQL Server 2008 R2. من التوثيق :

enter image description here

لا توجد أيضًا طريقة لجعله يفشل في 2012+ ، حتى مع مستوى التوافق. لذا اطلب من موظفيك التحقق من SELECT @@VERSION; على كلا الخادمين ؛ ستجد أنه في حالة فشل CONCAT ، يكون الرقم أقل من 11. لكي تجعل الكود الخاص بك متوافقًا مع الإصدارات السابقة ، ستحتاج إلى استخدام عامل تشغيل سلسلة السلاسل القياسي (+). لا أعرف كيف ستفعل ذلك باستخدام دالة قياسية ، إلا إذا كنت تستخدم دائمًا بالضبط نفس عدد سلاسل الإدخال و قمت بتغيير التعليمات البرمجية لاستخدام dbo.CONCAT() بدلاً من CONCAT() (ستكون هناك سيناريوهات حيث يهم ذلك ، بالإضافة إلى أنه إذا كانت وظيفتك تفعل أي شيء لا يقوم به المواطن الأصلي ، فأنت تريد سلوك ثابت إذا/عند الترقية). لذلك لا أوصي بهذا النهج. قد تحتاج أيضًا إلى إضافة NULL معالجة وغير ذلك من التغييرات الطفيفة (من المستحيل إخبارك بكيفية تغيير النص البرمجي الحالي تمامًا ، إذا لم نتمكن من رؤيته).

21
Aaron Bertrand

يمكنك استخدام الدالة ODBC CONCAT مثل هذا:

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

تكمن المشكلة في أن هذه الوظيفة تتيح لك معلمتين فقط في كل مرة. لذلك ما لم ترغب في استخدام أكثر من اثنين مثل هذا:

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

يمكنك أيضًا استخدام عامل التشغيل "+".

4
bfs