' CONCAT ' ist kein anerkannter integrierter Funktionsname
On Februar 17, 2021 by adminEin Client hat gemeldet, dass er unter SQL Server 2012 ausgeführt wird, und wir haben vor einer endgültigen Übermittlung einige Testabfragen zum Testen bereitgestellt:
“ CONCAT „ist kein anerkannter integrierter Funktionsname.
Ich verstehe, dass CONCAT()
neu erstellt wurde Die in SQL Server 2012 eingeführte Funktion ist in Ordnung und in Ordnung. Ich wurde jedoch gebeten, meine Änderung zurückzusetzen, um diese 2008R2-kompatibel zu machen, unter dem Deckmantel, dass der Benutzer, der die Abfrage ausführt, möglicherweise keine Transact-SQL-Berechtigungen zum Ausführen hat . “ Ich beweise nur, dass auf dem Client höchstwahrscheinlich eine andere Version von SQL Server in DEV installiert ist als in PROD.
Ich kann keine Informationen darüber finden, wie SELECT/EXECUTE
Berechtigungen für integrierte skalarwertige Funktionen, aber ist dies möglich, und wenn ja, erhält der Benutzer immer noch denselben Fehlertext?
Kommentare
- Wenn concat nicht funktioniert, versuchen Sie es mit
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
- CONCAT unterstützt concat vom Dezimaltyp (ID + _ ' + OtherID), ID kann vom Typ int sein.
- Verwenden Sie in älteren Versionen stattdessen Folgendes:
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Antwort
CONCAT
wurde eingeführt In SQL Server 2012 gibt es keine Möglichkeit, es in SQL Server 2008 R2 zum Laufen zu bringen. Aus der Dokumentation :
Es gibt auch keine Möglichkeit, 2012+ einen Fehler zu verursachen, selbst bei Kompatibilitätsstufe. Lassen Sie Ihre Mitarbeiter auf beiden Servern SELECT @@VERSION;
überprüfen. Sie werden feststellen, dass CONCAT
fehlschlägt, wenn < 11. Um Ihren Code mit früheren Versionen kompatibel zu machen, benötigen Sie um den Standard-String-Verkettungsoperator zu verwenden (+
). Ich weiß nicht, wie Sie dies mit einer Skalarfunktion tun würden, es sei denn, Sie haben immer die exakte gleiche Anzahl von Eingabezeichenfolgen und Sie ändern Ihren Code so, dass dbo.CONCAT()
anstelle von CONCAT()
verwendet wird (es wird Szenarien geben, in denen es wichtig ist, plus Wenn Ihre Funktion etwas tut, was der native nicht tut, möchten Sie ein konsistentes Verhalten, wenn Sie ein Upgrade durchführen. Daher würde ich diesen Ansatz nicht empfehlen. Möglicherweise müssen Sie auch die NULL
-Handhabung und andere geringfügige Änderungen hinzufügen (es ist unmöglich, Ihnen zu sagen, wie Sie Ihr vorhandenes Skript genau ändern können, wenn wir dies nicht können siehe da).
Kommentare
- Danke, Aaron. Der Code ist trivial zu ändern, da CONCAT () nur verwendet wird, um einige Zeichenfolgen vor einem dynamischen SQL-Aufruf von SP_ExecuteSQL miteinander zu verbinden. Ich wollte wirklich nur bestätigen, dass es KEINE Möglichkeit gibt, den Zugriff auf CONCAT () in SQL Server 2012 zu verweigern.
- @beeks Ich kenne ' keine Möglichkeit, Benutzern die Verwendung von
CONCAT()
zu verweigern, Nr. Ich folge ' nicht ganz, welche Auswirkungen dies auf das hat, was Sie tun müssen, damit der Code auf 2008 R2 funktioniert. Sie müssenCONCAT()
entfernen und nicht hinzufügen. - Ja, ich verstehe, wie der Code mit 2008 R2 kompatibel gemacht werden kann ist trivial. Vielen Dank für die Bestätigung, dass Sie
DENY
nicht auf diese Funktion zugreifen können. - Nur zu beachten, wenn Sie den concat auf + you ' ll muss sicherstellen, dass verkettete Werte zunächst Zeichenfolgen sind. Wenn Sie numerische Felder haben, wird versucht, diese hinzuzufügen (und schlägt fehl, weil eine Zeichenfolge kein int ist). Wenn also ein numerisches Feld (Typ) make vorhanden ist Stellen Sie sicher, dass Sie es zuerst in einen String konvertieren / umwandeln.
Antwort
Sie können die ODBC CONCAT-Funktion wie folgt verwenden :
SELECT {fn CONCAT("foo ", "test") }
Das Problem dabei ist, dass diese Funktion nur zwei Parameter zulässt zu einer Zeit. Es sei denn, Sie möchten mehr als zwei davon verwenden:
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
Möglicherweise Verwenden Sie auch einfach den Operator „+“.
Schreibe einen Kommentar