web-dev-qa-db-fra.com

'CONCAT' n'est pas un nom de fonction intégré reconnu

Un client a indiqué qu'il s'exécutait sur SQL Server 2012, et nous avons toutefois envoyé quelques requêtes de test pour les tests avant une livraison finale:

"CONCAT" n'est pas un nom de fonction intégrée reconnu.

Je comprends que CONCAT() est une nouvelle fonction intégrée introduite dans SQL Server 2012, ce qui est très bien, mais on m'a demandé d'annuler ma modification pour rendre ce 2008R2 compatible sous le couvert de " l'utilisateur exécutant la requête peut ne pas disposer des autorisations Transact-SQL pour s'exécuter. " Je prouve donc simplement que le client a très probablement une version différente de SQL Server installée dans DEV que dans PROD.

Je ne trouve aucune information sur le refus spécifique de SELECT/EXECUTE autorisations pour les fonctions scalaires intégrées, mais est-ce possible, et si oui, l'utilisateur reçoit-il toujours le même texte d'erreur?

27
beeks

CONCAT a été introduit dans SQL Server 2012; il n'y a aucun moyen de le faire fonctionner dans SQL Server 2008 R2. De la documentation :

enter image description here

Il n'y a également aucun moyen de le faire échouer en 2012+, même avec un niveau de compatibilité. Demandez à vos employés de vérifier SELECT @@VERSION; Sur les deux serveurs; vous constaterez que là où CONCAT échoue, il est <11. Pour rendre votre code compatible avec les versions antérieures, vous devrez utiliser l'opérateur de concaténation de chaîne standard (+). Je ne sais pas comment vous le feriez avec une fonction scalaire, à moins que vous n'utilisiez toujours le exact même nombre de chaînes d'entrée et vous changez votre code pour utiliser dbo.CONCAT() au lieu de CONCAT() (il y aura des scénarios où cela compte, plus si votre fonction fait quelque chose que le natif ne fait pas, vous voulez comportement cohérent si/quand vous mettez à niveau). Je ne recommanderais donc pas cette approche. Vous devrez peut-être également ajouter la gestion de NULL et d'autres modifications mineures (impossible de vous dire comment changer exactement votre script existant, si nous ne le voyons pas).

21
Aaron Bertrand

Vous pouvez utiliser la fonction ODBC CONCAT comme ceci:

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

Le problème avec ceci est que cette fonction ne vous permet que deux paramètres à la fois. Donc, sauf si vous souhaitez en utiliser plus de deux comme ceci:

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

Vous pourriez tout aussi bien utiliser l'opérateur "+".

4
bfs