Skip to content
Tiantan
Articles

' CONCAT ' är inte ett erkänt inbyggt funktionsnamn

On februari 17, 2021 by admin

En 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 :

ange bildbeskrivning här

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

  • Tack, Aaron. Koden är trivial att ändra, eftersom CONCAT () bara används för att sammanfoga några strängar före ett SP_ExecuteSQL dynamiskt SQL-samtal. Jag ville bara bekräfta att det inte fanns något sätt att neka åtkomst till att använda CONCAT () i SQL Server 2012
  • @beeks Jag vet inte ' sätt att neka användare möjligheten att använda 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 bort CONCAT(), inte lägga till den.
  • ja, jag förstår hur man gör koden kompatibel med 2008 R2, det är trivialt. Tack för att du har bekräftat att man inte kan DENY tillgång till den här funktionen.
  • Bara att notera när du ändrar concat till + du ' Jag måste se till att värden som sammanfogas är strängar till att börja med. Om du har några numeriska fält kommer det att försöka lägga till dem (och misslyckas eftersom en sträng inte är en int) så om det finns ett numeriskt fält (typ) gör se till att du först konverterar / kastar den till en sträng

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.

Written by admin

Lämna ett svar Avbryt svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Senaste inläggen

  • Med hjälp av en balun med en resonansdipol
  • Vad är skillnaden mellan “ kan inte ” och “ kan inte ”? [duplicera]
  • På JFK, kan du flytta mellan terminalerna på sidan om inrikesflyg?
  • “ Uppskattat djupt ” eller “ uppskattade ”
  • Vad betyder ' abstrakta idéer '? [stängd]

Arkiv

  • 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
  • 日本語
  • 한국어

Copyright Tiantan 2021 | Theme by Theme in Progress | Proudly powered by WordPress

Back to top