Skip to content
Tiantan
Articles

' CONCAT ' is geen herkende ingebouwde functienaam

Geplaatst op februari 17, 2021 door admin

Een 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

  • Als concat niet werkt, probeer dan deze SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
  • CONCAT ondersteunt decimaal type concat (ID + ' _ ' + OtherID), ID kan int-type zijn.
  • Gebruik in oudere versies dit in plaats daarvan: DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;

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 :

voer de afbeeldingbeschrijving hier in

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 verwijderen CONCAT(), 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.

Geschreven door admin

Geef een reactie Antwoord annuleren

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Meest recente berichten

  • Met behulp van een balun met een resonerende dipool
  • Wat is het verschil tussen “ kan niet ” en “ kan niet ”? [duplicate]
  • Kunt u zich bij JFK op binnenlandse vluchten tussen terminals aan de airside verplaatsen?
  • “ Zeer gewaardeerd ” of “ zeer gewaardeerd ”
  • Wat betekent ' abstracte ideeën '? [gesloten]

Archief

  • februari 2021
  • januari 2021
  • december 2020
  • november 2020
  • Deutsch
  • Nederlands
  • Svenska
  • Norsk
  • Dansk
  • Español
  • Français
  • Português
  • Italiano
  • Română
  • Polski
  • Čeština
  • Magyar
  • Suomi
  • 日本語
  • 한국어

Auteursrecht Tiantan 2021 | Thema door Theme in Progress | Mogelijk gemaakt door WordPress

Naar boven