Verwenden des Sql_variant-Datentyps

JDBC-Treiber herunterladen

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, kann getDateTime()/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() oder getObject().

  • 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

Grundlegendes zu den Datentypen des JDBC-Treibers