' CONCAT ' er ikke et anerkendt indbygget funktionsnavn
On februar 17, 2021 by adminEn klient rapporterede, at de kørte på SQL Server 2012, og vi leverede nogle testforespørgsler til test inden en endelig levering, dog:
” CONCAT “er ikke et anerkendt indbygget funktionsnavn.
Jeg forstår, at CONCAT()
er en nybygget -i funktion introduceret i SQL Server 2012, som alt sammen er fint og godt, men jeg er blevet bedt om at rulle min ændring tilbage for at gøre denne 2008R2 kompatibel under dække af “brugeren, der udfører forespørgslen, har muligvis ikke Transact-SQL-tilladelser til at udføre . ” Så jeg beviser bare mit pointer, at klienten sandsynligvis har en anden version af SQL Server installeret i DEV end de gør i PROD.
Jeg kan ikke finde nogen oplysninger om specifikt at afvise SELECT/EXECUTE
tilladelser til indbyggede skalære værdifunktioner, men er det muligt, og i så fald modtager brugeren stadig den samme fejltekst?
Kommentarer
- Hvis concat ikke fungerer, så prøv denne
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
- CONCAT understøtter decataltype concat (ID + ' _ ' + OtherID), ID kan være int-type.
- I ældre versioner skal du bruge dette i stedet:
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Svar
CONCAT
blev introduceret i SQL Server 2012; der er ingen måde at få det til at fungere i SQL Server 2008 R2. Fra dokumentationen :
Der er heller ingen måde at få det til at mislykkes i 2012+, selv med kompatibilitetsniveau. Så få dine folk til at kontrollere SELECT @@VERSION;
på begge servere; du “finder ud af, at hvor CONCAT
mislykkes, er det < 11. For at gøre din kode kompatibel med tidligere versioner, skal du for at bruge operatøren til standardstrengskonkatenation (+
). Jeg ved ikke, hvordan du ville gøre dette med en skalarfunktion, medmindre du altid brugte nøjagtigt det samme antal inputstrenge og du ændrer din kode til at bruge dbo.CONCAT()
i stedet for CONCAT()
(der vil være scenarier, hvor det betyder noget, plus hvis din funktion gør noget, som den oprindelige ikke gør, vil du have ensartet adfærd, hvis / når du opgraderer). Så jeg vil ikke anbefale denne tilgang. Det kan også være nødvendigt at tilføje NULL
håndtering og andre mindre ændringer (umuligt at fortælle dig, hvordan du ændrer dit eksisterende script nøjagtigt, hvis vi ikke kan “t se det).
Kommentarer
Svar
Du kan bruge ODBC CONCAT-funktionen som denne :
SELECT {fn CONCAT("foo ", "test") }
Problemet med dette er, at denne funktion kun giver dig to parametre på et tidspunkt. Så medmindre du vil bruge mere end to på denne måde:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Du kan muligvis brug også “+” -operatoren.
CONCAT()
, nr. Jeg følger ikke ', hvad der har betydning for, hvad du skal gøre for at få koden til at fungere på 2008 R2. Du skal fjerneCONCAT()
, ikke tilføje den.DENY
adgang til denne funktion.