Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.TimestampProblemumgehung: 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.