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


24

Un client a signalé 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 qu'il CONCAT()s'agit d'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 prétexte que "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 d' SELECT/EXECUTEautorisations pour les fonctions à valeur scalaire intégrées, mais est-ce possible, et si oui, l'utilisateur reçoit-il toujours le même texte d'erreur?


Si le concat ne fonctionne pas, essayez celui-ciSELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal Sethi

CONCAT prend en charge le type concat décimal (ID + '_' + OtherID), l'ID peut être de type int.
Zhang

Dans les anciennes versions, utilisez-le à la place:DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Jack Whittaker

Réponses:


21

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

entrez la description de l'image ici

Il n'y a également aucun moyen de le faire échouer en 2012+, même avec un niveau de compatibilité. Demandez donc à votre personnel de vérifier SELECT @@VERSION;sur les deux serveurs; vous constaterez que là où CONCATéchoue, il est <11. Afin de 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, sauf si vous avez toujours utilisé exactement le même nombre de chaînes d'entrée et que vous modifiez votre code à utiliser à la dbo.CONCAT()place de CONCAT()(il y aura des scénarios où cela compte, plus si votre fonction fait quelque chose le natif ne le 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 ajouterNULL gestion et autres changements mineurs (impossible de vous dire comment changer exactement votre script existant, si nous ne le voyons pas).


Merci, Aaron. Le code est trivial à changer, car CONCAT () est juste utilisé pour joindre certaines chaînes avant un appel SQL dynamique SP_ExecuteSQL. Je voulais simplement confirmer qu'il n'y avait AUCUN moyen de refuser l'accès à l'utilisation de CONCAT () dans SQL Server 2012
1er

1
@beeks Je ne connais aucun moyen de refuser aux utilisateurs la possibilité d'utiliser CONCAT(), non. Cependant, je ne comprends pas très bien quelle incidence cela a sur ce que vous devez faire pour que le code fonctionne sur 2008 R2. Vous devez supprimer CONCAT() , pas l'ajouter.
Aaron Bertrand

1
oui, je comprends comment rendre le code compatible avec 2008 R2, c'est trivial. Merci d'avoir confirmé que l'on ne peut pas DENYaccéder à cette fonction.
1er

Juste pour noter que lorsque vous modifiez la concaténation en +, vous devrez vous assurer 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 n'est pas un int), donc si il y a un champ numérique (type) assurez-vous de le convertir / de le convertir en chaîne en premier
Ste Bov

3

Vous pouvez utiliser la fonction ODBC CONCAT comme ceci:

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

Le problème 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 «+».

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.