' CONCAT ' nest pas un nom de fonction intégré reconnu
On février 17, 2021 by adminUn client a signalé quil sexécutait sur SQL Server 2012, et nous avons livré quelques requêtes de test pour les tests avant une livraison finale, cependant:
» CONCAT « nest pas un nom de fonction intégré reconnu.
Je comprends que CONCAT()
est une nouvelle version -in fonction introduite dans SQL Server 2012, ce qui est très bien, mais on ma demandé dannuler ma modification pour rendre ce 2008R2 compatible sous le couvert de « lutilisateur exécutant la requête peut ne pas avoir les autorisations Transact-SQL pour 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 tel est le cas, lutilisateur reçoit-il toujours le même texte derreur?
Commentaires
La réponse
CONCAT
a été introduite dans SQL Server 2012; il nexiste aucun moyen de le faire fonctionner dans SQL Server 2008 R2. Depuis la documentation :
Il ny a également aucun moyen de le faire échouer en 2012+, même avec le niveau de compatibilité. Demandez donc à vos employés de vérifier SELECT @@VERSION;
sur les deux serveurs; vous « trouverez que là où CONCAT
échoue, cest < 11. Afin de rendre votre code compatible avec les versions antérieures, vous aurez besoin pour utiliser lopérateur de concaténation de chaîne standard (+
). Je ne sais pas comment vous feriez cela avec une fonction scalaire, à moins que vous nutilisiez toujours le même nombre exact de chaînes dentrée et vous modifiez 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 un comportement cohérent si / quand vous mettez à niveau). Je ne recommanderais donc pas cette approche. Vous devrez peut-être également ajouter la gestion NULL
et d’autres modifications mineures (impossible de vous dire comment modifier exactement votre script existant, si nous pouvons « t voir).
Commentaires
- Merci, Aaron. Le code est simple à changer, car CONCAT () est simplement utilisé pour joindre certaines chaînes avant un appel SQL dynamique SP_ExecuteSQL. Je voulais simplement confirmer quil ny avait AUCUN moyen de refuser laccès à lutilisation de CONCAT () dans SQL Server 2012
- @beeks Je ne ' Je ne connais aucun moyen de refuser aux utilisateurs la possibilité dutiliser
CONCAT()
, non. Je ne ' pas tout à fait suivre ce que cela a sur ce que vous devez faire pour que le code fonctionne sur 2008 R2, cependant. Vous devez supprimerCONCAT()
, pas lajouter. - oui, je comprends comment rendre le code compatible avec 2008 R2, cela est trivial. Merci davoir confirmé que lon ne peut pas
DENY
accéder à cette fonction. - Juste à noter lors du changement de concat en + vous ' ll faut sassurer que les valeurs concaténées sont des chaînes pour commencer, si vous avez des champs numériques, il essaiera de les ajouter (et échouera car une chaîne nest pas un int) donc sil y a un champ numérique (type), faites assurez-vous de le convertir / transtyper dabord en une chaîne
Answer
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, à moins que vous ne souhaitiez en utiliser plus de deux comme ceci:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Vous pourriez aussi utilisez simplement lopérateur « + ».
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;