Verwenden des Sql_variant-Datentyps
Ab Version 6.3.0 unterstützt der JDBC-Treiber den Datentyp sql_variant. Sql_variant wird bei Verwendung von Features wie Tabellenwertparametern und Massenkopieren ebenfalls unterstützt, allerdings gelten in diesem Fall einige Einschränkungen. Nicht alle Datentypen können im sql_variant-Datentyp gespeichert werden. Eine Liste der für sql_variant unterstützten Datentypen finden Sie unter sql_variant (Transact-SQL).
Auffüllen und Abrufen einer Tabelle
Angenommen, eine Tabelle enthält eine sql_variant-Spalte wie diese:
CREATE TABLE sampleTable (col1 sql_variant)
Nachfolgend ist ein Beispielskript zum Einfügen von Werten mithilfe einer Anweisung gezeigt:
try (Statement stmt = connection.createStatement()){
stmt.execute("insert into sampleTable values (1)");
}
So fügen Sie Werte mit einer vorbereiteten Anweisung ein:
try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {
preparedStatement.setObject(1, 1);
preparedStatement.execute();
}
Wenn der zugrunde liegende Typ der Daten, die übergeben werden, bekannt ist, kann der entsprechende Setter verwendet werden. Beispiel: Beim Einfügen eines ganzzahligen Werts kann preparedStatement.setInt()
verwendet werden.
try (PreparedStatement preparedStatement = con.prepareStatement("insert into table values (?)")) {
preparedStatement.setInt (1, 1);
preparedStatement.execute();
}
Um Werte aus der Tabelle zu lesen, können die entsprechenden Getter verwendet werden. Wenn die vom Server empfangenen Werte bekannt sind, kann z.B. die Methode getInt()
oder getString()
verwendet werden:
try (SQLServerResultSet resultSet = (SQLServerResultSet) stmt.executeQuery("select * from sampleTable ")) {
resultSet.next();
resultSet.getInt(1); //or rs.getString(1); or rs.getObject(1);
}
Verwenden von gespeicherten Prozeduren mit sql_variant
Gehen wir von folgender gespeicherter Prozedur aus:
String sql = "CREATE PROCEDURE " + inputProc + " @p0 sql_variant OUTPUT AS SELECT TOP 1 @p0=col1 FROM sampleTable ";
Ausgabeparameter müssen registriert werden:
try (CallableStatement callableStatement = con.prepareCall(" {call " + inputProc + " (?) }")) {
callableStatement.registerOutParameter(1, microsoft.sql.Types.SQL_VARIANT);
callableStatement.execute();
}
Einschränkungen von sql_variant
Bei Verwendung von TVPs zum Auffüllen einer Tabelle mit einem
datetime
/smalldatetime
/date
-Wert, der in einem sql_variant-Datentyp gespeichert ist, kanngetDateTime()
/getSmallDateTime()
/getDate()
nicht für ein Resultset aufgerufen werden. Der Vorgang wird mit folgender Ausnahme abgebrochen:Java.lang.String cannot be cast to java.sql.Timestamp
Problemumgehung: Verwenden Sie stattdessen
getString()
odergetObject()
.Das Verwenden von TVPs zum Auffüllen einer Tabelle und Senden eines NULL-Werts in einem sql_variant-Datentyp wird nicht unterstützt. Versuchen Sie dies, wird eine Ausnahme zurückgegeben:
Inserting null value with column type sql_variant in TVP is not supported.
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für