' CONCAT ' är inte ett erkänt inbyggt funktionsnamn
On februari 17, 2021 by adminEn klient rapporterade att de körde på SQL Server 2012, och vi levererade några testfrågor för testning före en slutlig leverans, dock:
” CONCAT ”är inte ett erkänt inbyggt funktionsnamn.
Jag förstår att CONCAT()
är en nybyggd -funktion som introducerades i SQL Server 2012, vilket är bra och bra, men jag har blivit ombedd att återställa min ändring för att göra denna 2008R2-kompatibel under täcke av ”att användaren som kör frågan kanske inte har Transact-SQL-behörigheter att utföra . ” Så jag bevisar bara min poäng att klienten sannolikt har en annan version av SQL Server installerad i DEV än de gör i PROD.
Jag kan inte hitta någon information om att specifikt neka SELECT/EXECUTE
behörigheter för inbyggda skalära värderade funktioner, men är det möjligt, och i så fall får användaren fortfarande samma feltext?
Kommentarer
- Om concat inte fungerar, prova den här
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
- CONCAT stöder decataltyp concat (ID + ' _ ' + OtherID), ID kan vara int-typ.
- I äldre versioner, använd detta istället:
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Svar
CONCAT
introducerades i SQL Server 2012, det finns inget sätt att få det att fungera i SQL Server 2008 R2. Från dokumentationen :
Det finns inget sätt att få det att misslyckas 2012+, även med kompatibilitetsnivå. Så låt ditt folk kontrollera SELECT @@VERSION;
på båda servrarna; du kommer att finna att där CONCAT
misslyckas är det < 11. För att göra din kod kompatibel med tidigare versioner, måste du för att använda standardsträngkonkateringsoperatören (+
). Jag vet inte hur du skulle göra detta med en skalarfunktion, såvida du inte alltid använde exakt samma antal inmatningssträngar och du ändrar din kod för att använda dbo.CONCAT()
istället för CONCAT()
(det kommer att finnas scenarier där det spelar roll, plus om din funktion gör något som den infödda inte gör, vill du ha konsekvent beteende om / när du uppgraderar). Så jag skulle inte rekommendera det tillvägagångssättet. Du kan också behöva lägga till NULL
hantering och andra mindre ändringar (omöjligt att berätta hur du ändrar ditt befintliga skript exakt, om vi inte kan ”t se det).
Kommentarer
Svar
Du kan använda ODBC CONCAT-funktionen så här :
SELECT {fn CONCAT("foo ", "test") }
Problemet med detta är att den här funktionen bara tillåter dig två parametrar vid en tid. Så om du inte vill använda mer än två så här:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Du kanske använd bara ”+” -operatören.
CONCAT()
, nr. Jag följer inte ' vilken betydelse det har för vad du behöver göra för att få koden att fungera på 2008 R2. Du måste ta bortCONCAT()
, inte lägga till den.DENY
tillgång till den här funktionen.