Verwenden von SQL-Escapesequenzen
Microsoft JDBC-Treiber für SQL Server unterstützt die Verwendung von SQL-Escapesequenzen gemäß der Definition durch die JDBC-API. Mithilfe von Escapesequenzen wird in einer SQL-Anweisung für den Treiber angegeben, dass der Teil der SQL-Zeichenfolge mit Escapezeichen anders behandelt werden soll. Wenn der JDBC-Treiber den Teil einer SQL-Anweisung mit Escapezeichen verarbeitet, wird dieser Teil der Zeichenfolge in SQL-Code übersetzt, den SQL Server verwenden kann.
Es gibt fünf Arten von Escapesequenzen, die für die JDBC-API erforderlich sind. Alle werden vom JDBC-Treiber unterstützt:
- LIKE-Platzhalterliterale
- Funktionsbehandlung
- Datums- und Zeitliterale
- Aufrufe gespeicherter Prozeduren
- Äußere Joins
- LIMIT-Escapesyntax
JDBC-Treiber verwendet die folgende Escapesequenzsyntax:
{keyword ...parameters...}
Hinweis
Die SQL-Escapeverarbeitung ist für den JDBC-Treiber immer aktiviert.
In den folgenden Abschnitten werden die fünf Arten von Escapesequenzen und ihre Unterstützung durch den JDBC-Treiber beschrieben.
LIKE-Platzhalterliterale
Der JDBC-Treiber unterstützt die {escape 'escape character'}
-Syntax zum Verwenden von LIKE-Klauselplatzhaltern als Literale. Der folgende Code gibt beispielsweise Werte für „col3“ zurück, wenn der Wert von „col2“ wirklich mit einem Unterstrich beginnt (und nicht mit dem Platzhalter).
ResultSet rst = stmt.executeQuery("SELECT col3 FROM test1 WHERE col2
LIKE '\\_%' {escape '\\'}");
Hinweis
Die Escapesequenz muss sich am Ende der SQL-Anweisung befinden. Bei mehreren SQL-Anweisungen in einer Befehlszeichenfolge muss sich die Escapesequenz am Ende jeder relevanten SQL-Anweisung befinden.
Funktionsbehandlung
Der JDBC-Treiber unterstützt Funktionsescapesequenzen in SQL-Anweisungen mit der folgenden Syntax:
{fn functionName}
Dabei ist functionName
eine vom JDBC-Treiber unterstützte Funktion. Beispiel:
SELECT {fn UCASE(Name)} FROM Employee
In der folgenden Tabelle werden die unterschiedlichen Funktionen aufgeführt, die der JDBC-Treiber bei der Verwendung einer Funktionsescapesequenz unterstützt.
Zeichenfolgenfunktionen | Numerische Funktionen | datetime-Funktionen | Systemfunktionen |
---|---|---|---|
ASCII CHAR CONCAT DIFFERENCE INSERT LCASE LEFT LENGTH LOCATE LTRIM REPEAT REPLACE RIGHT RTRIM SOUNDEX SPACE SUBSTRING UCASE |
ABS (ABS) ACOS ASIN ATAN ATAN2 CEILING COS COT DEGREES EXP FLOOR LOG LOG10 MOD PI POWER RADIANS RAND ROUND SIGN SIN SQRT TAN TRUNCATE |
CURDATE CURTIME DAYNAME DAYOFMONTH TAGDERWOCHE TAGDESJAHRES EXTRACT HOUR MINUTE MONTH MONTHNAME NOW QUARTER SECOND TIMESTAMPADD TIMESTAMPDIFF WEEK YEAR |
DATABASE IFNULL USER |
Hinweis
Wenn Sie versuchen, eine von der Datenbank nicht unterstützte Funktion zu verwenden, tritt ein Fehler auf.
Datums- und Zeitliterale
Die Escapesyntax für Datums-, Zeit- und Timestampliterale lautet wie folgt:
{literal-type 'value'}
Hierbei ist literal-type
einer der folgenden Typen:
Literaltyp | BESCHREIBUNG | Wertformat |
---|---|---|
d | Date | yyyy-mm-dd |
t | Time | hh:mm:ss [1] |
ts | TimeStamp | yyyy-mm-dd hh:mm:ss[.f...] |
Beispiel:
UPDATE Orders SET OpenDate={d '2005-01-31'}
WHERE OrderID=1025
Aufrufe gespeicherter Prozeduren
Der JDBC-Treiber unterstützt die {? = call proc_name(?,...)}
- und die {call proc_name(?,...)}
-Escapesyntax für Aufrufe gespeicherter Prozeduren, je nachdem, ob ein Rückgabeparameter verarbeitet werden muss.
Bei einer Prozedur handelt es sich um ein in der Datenbank gespeichertes, ausführbares Objekt. In der Regel handelt es sich dabei um eine oder mehrere vorkompilierte SQL-Anweisungen. Die Escapesequenzsyntax zum Aufrufen einer gespeicherten Prozedur lautet wie folgt:
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
Dabei gibt procedure-name
den Namen einer gespeicherten Prozedur an, und parameter
gibt einen Parameter für eine gespeicherte Prozedur an.
Weitere Informationen zur Verwendung der Escapesequenz call
mit gespeicherten Prozeduren finden Sie unter Verwenden von Anweisungen mit gespeicherten Prozeduren.
Äußere Joins
Der JDBC-Treiber unterstützt die linke, rechte und vollständige äußere SQL92-Joinsyntax. Die Escapesequenz für äußere Joins lautet wie folgt:
{oj outer-join}
Dabei lautet der äußere Join:
table-reference {LEFT | RIGHT | FULL} OUTER JOIN
{table-reference | outer-join} ON search-condition
Dabei ist table-reference
ein Tabellenname, und search-condition
ist die Joinbedingung, die für die Tabellen verwendet werden soll.
Beispiel:
SELECT Customers.CustID, Customers.Name, Orders.OrderID, Orders.Status
FROM {oj Customers LEFT OUTER JOIN
Orders ON Customers.CustID=Orders.CustID}
WHERE Orders.Status='OPEN'
Die folgenden Escapesequenzen für äußere Joins werden vom JDBC-Treiber unterstützt:
- Linke äußere Joins
- Rechte äußere Joins
- Vollständige äußere Joins
- Geschachtelte äußere Joins
LIMIT-Escapesyntax
Hinweis
Die LIMIT-Escapesyntax wird nur bei Verwendung von JDBC 4.1 oder höher vom Microsoft JDBC-Treiber 4.2 (oder höher) für SQL Server unterstützt.
Die Escapesyntax für LIMIT ist wie folgt:
LIMIT <rows> [OFFSET <row offset>]
Die Escapesyntax besteht aus zwei Teilen: <rows> ist obligatorisch und gibt die Anzahl der zurückzugebenden Zeilen an. OFFSET und <row offset> sind optional und geben die Anzahl der zu überspringenden Zeilen an, bevor mit der Rückgabe von Zeilen begonnen wird. Der JDBC-Treiber unterstützt nur den obligatorischen Teil, indem er die Abfrageklausel von LIMIT in TOP umwandelt. SQL Server unterstützt die LIMIT-Klausel nicht. Der JDBC-Treiber unterstützt den optionalen Parameter <row offset> nicht, und der Treiber löst eine Ausnahme aus, wenn dieser Parameter verwendet wird.