'CONCAT' ist kein anerkannter eingebauter Funktionsname

24

Ein Client hat gemeldet, dass sie unter SQL Server 2012 ausgeführt werden, und wir haben vor einer endgültigen Übermittlung einige Testabfragen zum Testen übermittelt.

'CONCAT' ist kein anerkannter eingebauter Funktionsname.

Ich verstehe, dass dies CONCAT()eine neue integrierte Funktion ist, die in SQL Server 2012 eingeführt wurde, die alles in Ordnung und in Ordnung ist. Ich wurde jedoch gebeten, meine Änderung rückgängig zu machen, um diese 2008R2-kompatibel zu machen, unter dem Deckmantel, dass der Benutzer, der die Abfrage ausführt, dies möglicherweise nicht tut Transact-SQL-Berechtigungen zum Ausführen haben. " Ich möchte nur beweisen, 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/EXECUTEBerechtigungen für integrierte skalare Funktionen speziell verweigert werden. Ist dies jedoch möglich, und wenn ja, erhält der Benutzer immer noch denselben Fehlertext?

Beeks
quelle
Wenn concat nicht funktioniert, probieren Sie diesesSELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
Nilachal Sethi
CONCAT unterstützt den Dezimaltyp concat (ID + '_' + OtherID), ID kann vom Typ int sein.
Zhang
Verwenden Sie in älteren Versionen stattdessen DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;
Jack Whittaker

Antworten:

21

CONCATwurde in SQL Server 2012 eingeführt; In SQL Server 2008 R2 ist dies nicht möglich. Aus der Dokumentation :

Bildbeschreibung hier eingeben

Es gibt auch keine Möglichkeit, es 2012+ zum Scheitern zu bringen, selbst wenn die Kompatibilitätsstufe erreicht ist. Lassen Sie also Ihre Mitarbeiter SELECT @@VERSION;auf beiden Servern nachsehen. Sie werden feststellen, dass der CONCATFehler <11 ist. Um Ihren Code mit früheren Versionen kompatibel zu machen, müssen Sie den Standardoperator für die Verkettung von Zeichenfolgen ( +) verwenden. Ich weiß nicht, wie Sie dies mit einer Skalarfunktion tun würden, es sei denn, Sie haben immer genau die gleiche Anzahl von Eingabezeichenfolgen verwendet und Sie ändern Ihren Code, um dbo.CONCAT()anstelle von CONCAT()(es wird Szenarien geben, in denen es wichtig ist, und wenn Ihre Funktion etwas tut) Der Native tut dies nicht. Sie möchten ein konsistentes Verhalten, wenn / wenn Sie ein Upgrade durchführen. Daher würde ich diesen Ansatz nicht empfehlen. Möglicherweise müssen Sie auch hinzufügenNULL Handhabung und andere kleinere Änderungen (Sie können nicht genau sagen, wie Sie Ihr vorhandenes Skript ändern sollen, wenn wir es nicht sehen können).

Aaron Bertrand
quelle
Danke, Aaron. Die Änderung des Codes ist trivial, da CONCAT () nur zum Zusammenfügen einiger Zeichenfolgen vor einem dynamischen SQL-Aufruf von SP_ExecuteSQL verwendet wird. Ich wollte wirklich nur bestätigen, dass es KEINE Möglichkeit gibt, den Zugriff auf die Verwendung von CONCAT () in SQL Server 2012 zu verweigern
beeks
1
@beeks Ich kenne keine Möglichkeit, Benutzern die Verwendung zu verweigern CONCAT(), nein. Ich verstehe jedoch nicht genau, welche Auswirkungen dies auf Ihre Arbeitsweise hat, damit der Code unter 2008 R2 funktioniert. Sie müssen es entfernen CONCAT() , nicht hinzufügen.
Aaron Bertrand
1
Ja, ich verstehe, wie man den Code mit 2008 R2 kompatibel macht, das ist trivial. Vielen Dank für die Bestätigung, dass man nicht DENYauf diese Funktion zugreifen kann.
Beeks
Wenn Sie das concat in das + ändern, müssen Sie sicherstellen, dass verkettete Werte zunächst Zeichenfolgen sind. Wenn Sie numerische Felder haben, wird versucht, diese hinzuzufügen (und dies schlägt fehl, da eine Zeichenfolge kein int ist) Es gibt ein numerisches Feld (Typ). Stellen Sie sicher, dass Sie es zuerst in einen String konvertieren / umwandeln
Ste Bov
3

Sie können die ODBC-CONCAT-Funktion folgendermaßen verwenden:

SELECT {fn CONCAT('foo ', 'test') }

Das Problem dabei ist, dass diese Funktion nur zwei Parameter gleichzeitig zulässt. Es sei denn, Sie möchten mehr als zwei davon verwenden:

SELECT {fn CONCAT('foo ', {fn CONCAT('test ', 'buddy')}) }

Sie können auch einfach den Operator '+' verwenden.

bfs
quelle