' CONCAT ' is geen herkende ingebouwde functienaam
Geplaatst op februari 17, 2021 door adminEen klant meldde dat ze op SQL Server 2012 draaiden, en we leverden enkele testquerys om te testen voorafgaand aan een definitieve levering, maar:
” CONCAT “is geen herkende ingebouwde functienaam.
Ik begrijp dat CONCAT()
een nieuwe versie is -in functie geïntroduceerd in SQL Server 2012, wat allemaal goed en wel is, maar ik ben gevraagd mijn wijziging ongedaan te maken om deze 2008R2 compatibel te maken onder het mom van “de gebruiker die de query uitvoert, heeft mogelijk geen Transact-SQL-machtigingen om uit te voeren . ” Dus ik wil alleen maar bewijzen dat de client hoogstwaarschijnlijk een andere versie van SQL Server heeft geïnstalleerd in DEV dan in PROD.
Ik kan “geen informatie vinden over het specifiek weigeren van SELECT/EXECUTE
rechten voor ingebouwde scalair gewaardeerde functies, maar is het mogelijk, en zo ja, ontvangt de gebruiker nog steeds dezelfde fouttekst?
Opmerkingen
Antwoord
CONCAT
werd geïntroduceerd in SQL Server 2012; er is geen manier om het te laten werken in SQL Server 2008 R2. Van de documentatie :
Er is ook geen manier om het te laten mislukken in 2012+, zelfs niet met het compatibiliteitsniveau. Dus laat uw mensen SELECT @@VERSION;
op beide servers controleren; je zult zien dat waar CONCAT
faalt, het < is. 11. Om je code compatibel te maken met eerdere versies, heb je om de standaard operator voor het samenvoegen van tekenreeksen te gebruiken (+
). Ik weet niet hoe je dit zou doen met een scalaire functie, tenzij je altijd het exacte hetzelfde aantal invoertekenreeksen en u wijzigt uw code om dbo.CONCAT()
te gebruiken in plaats van CONCAT()
(er zijn scenarios waar het ertoe doet, plus als je functie iets doet wat de native niet doet, wil je consistent gedrag als / wanneer je upgradet). Dus ik zou die aanpak niet aanbevelen. Mogelijk moet u ook NULL
afhandeling en andere kleine wijzigingen toevoegen (onmogelijk om u te vertellen hoe u uw bestaande script precies kunt wijzigen, als we zie het).
Reacties
- Bedankt, Aaron. Het is eenvoudig om de code te wijzigen, aangezien CONCAT () alleen wordt gebruikt om enkele strings samen te voegen vóór een dynamische SQL-aanroep van SP_ExecuteSQL. Ik wilde alleen maar bevestigen dat er GEEN manier was om de toegang tot het gebruik van CONCAT () in SQL Server 2012 te weigeren.
- @beeks Ik weet niet van ' manier om gebruikers de mogelijkheid te ontzeggen om
CONCAT()
te gebruiken, nee. Ik kan echter niet ' niet helemaal volgen wat voor invloed dat heeft op wat je moet doen om de code te laten werken op 2008 R2. U moet verwijderenCONCAT()
, niet toevoegen. - ja, ik begrijp hoe ik de code compatibel moet maken met 2008 R2, dat is triviaal. Bedankt voor de bevestiging dat men geen
DENY
toegang heeft tot deze functie. - Let op bij het wijzigen van de concat naar de + u ' ll moet ervoor zorgen dat de waarden die worden samengevoegd strings zijn om mee te beginnen, als je numerieke velden hebt, zal het proberen om ze toe te voegen (en faalt omdat een string geen int is), dus als er een numeriek veld is (type), make zorg ervoor dat je het eerst converteert / cast naar een string
Answer
Je kunt de ODBC CONCAT-functie als volgt gebruiken :
SELECT {fn CONCAT("foo ", "test") }
Het probleem hiermee is dat deze functie slechts twee parameters toestaat tegelijk. Dus tenzij u er meer dan twee op deze manier wilt gebruiken:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Misschien gebruik ook gewoon de “+” operator.
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;