' CONCAT ' er ikke et anerkjent innebygd funksjonsnavn
On februar 17, 2021 by adminEn klient rapporterte at de kjørte på SQL Server 2012, og vi leverte noen testspørsmål for testing før en endelig levering, men:
» CONCAT «er ikke et anerkjent innebygd funksjonsnavn.
Jeg forstår at CONCAT()
er en nybygd -i funksjon introdusert i SQL Server 2012, som er bra og bra, men jeg har blitt bedt om å tilbakestille endringen for å gjøre denne 2008R2-kompatibel under dekke av «brukeren som utfører spørringen, har kanskje ikke Transact-SQL-tillatelser til å utføre . » Så jeg viser bare poenget mitt at klienten sannsynligvis har en annen versjon av SQL Server installert i DEV enn de gjør i PROD.
Jeg kan ikke finne noen informasjon om spesifikt å nekte SELECT/EXECUTE
tillatelser for innebygde skalarverdige funksjoner, men er det mulig, og i så fall får brukeren fortsatt den samme feilteksten?
Kommentarer
Svar
CONCAT
ble introdusert i SQL Server 2012, det er ingen måte å få det til å fungere i SQL Server 2008 R2. Fra dokumentasjonen :
Det er heller ingen måte å få det til å mislykkes i 2012+, selv med kompatibilitetsnivå. Så la folket sjekke SELECT @@VERSION;
på begge serverne; du vil finne at der CONCAT
mislykkes, er det < 11. For å gjøre koden din kompatibel med tidligere versjoner, trenger du for å bruke standard strengkonkatenasjonsoperator (+
). Jeg vet ikke hvordan du ville gjort dette med en skalarfunksjon, med mindre du alltid brukte nøyaktig samme antall inngangsstrenger og du endrer koden for å bruke dbo.CONCAT()
i stedet for CONCAT()
(det vil være scenarier der det betyr noe, pluss hvis funksjonen din gjør noe den innfødte ikke gjør, vil du ha konsekvent oppførsel hvis / når du oppgraderer). Så jeg vil ikke anbefale den tilnærmingen. Du kan også trenge å legge til NULL
håndtering og andre mindre endringer (umulig å fortelle deg hvordan du kan endre ditt eksisterende skript nøyaktig, hvis vi ikke kan «t se det).
Kommentarer
- Takk, Aaron. Koden er triviell å endre, da CONCAT () nettopp brukes til å koble sammen noen strenger før et dynamisk SQL-anrop til SP_ExecuteSQL. Jeg ville egentlig bare bekrefte at det ikke var noen måte å nekte tilgang til å bruke CONCAT () i SQL Server 2012
- @beeks Jeg vet ikke ' måte å nekte brukerne muligheten til å bruke
CONCAT()
, nr. Jeg følger ikke ' hva slags betydning det har for hva du trenger å gjøre for å få koden til å fungere på 2008 R2. Du må fjerneCONCAT()
, ikke legge den til. - ja, jeg forstår hvordan jeg kan gjøre koden kompatibel med 2008 R2, at er trivielt. Takk for at du har bekreftet at man ikke kan
DENY
tilgang til denne funksjonen. - Bare å merke når du endrer concat til + deg ' Jeg må sørge for at verdier som sammenkobles er strenger til å begynne med. Hvis du har noen numeriske felt, vil den prøve å legge til dem (og mislykkes fordi en streng ikke er en int), så hvis det er et numerisk felt (type), gjør at du først konverterer / kaster den til en streng
Svar
Du kan bruke ODBC CONCAT-funksjonen slik :
SELECT {fn CONCAT("foo ", "test") }
Problemet med dette er at denne funksjonen bare tillater deg to parametere av gangen. Så med mindre du vil bruke mer enn to som dette:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Du kan i tillegg er det bare å bruke «+» -operatøren.
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;