Att använda Sql_variant-datatyp

Ladda ned JDBC-drivrutin

Från och med version 6.3.0 stöder JDBC-drivrutinen datatypen sql_variant. Sql_variant stöds också vid användning av funktioner som tabellvärdesparametrar och BulkCopy, med vissa begränsningar. Alla datatyper kan inte lagras i sql_variant datatypen. En lista över datatyper som stöds med sql_variant finns i sql_variant (Transact-SQL).

Fylla i och hämta en tabell

Förutsatt att en har en tabell med en sql_variant kolumn som:

CREATE TABLE sampleTable (col1 sql_variant)

Ett exempelskript för att infoga värden med ett påstående:

try (Statement stmt = connection.createStatement()){
    stmt.execute("insert into sampleTable values (1)");
}

Infogar värde med hjälp av förberedd instruktion:

try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {
    preparedStatement.setObject(1, 1);
    preparedStatement.execute();
}

Om den underliggande typen av data som skickas är känd kan respektive setter användas. Kan till exempel preparedStatement.setInt() användas när du infogar ett heltalsvärde.

try (PreparedStatement preparedStatement = con.prepareStatement("insert into table values (?)")) {
    preparedStatement.setInt (1, 1);
    preparedStatement.execute();
}

För att läsa värden från tabellen kan de respektive getter-metoderna användas. Du kan till exempel getInt()getString() använda metoder om värdena som kommer från servern är kända:

try (SQLServerResultSet resultSet = (SQLServerResultSet) stmt.executeQuery("select * from sampleTable ")) {
    resultSet.next();
    resultSet.getInt(1); //or rs.getString(1); or rs.getObject(1);
}

Använda lagrade procedurer med sql_variant

Ha en lagrad procedur, till exempel:

String sql = "CREATE PROCEDURE " + inputProc + " @p0 sql_variant OUTPUT AS SELECT TOP 1 @p0=col1 FROM sampleTable ";

Utdataparametrar måste registreras:

try (CallableStatement callableStatement = con.prepareCall(" {call " + inputProc + " (?) }")) {
    callableStatement.registerOutParameter(1, microsoft.sql.Types.SQL_VARIANT);
    callableStatement.execute();
}

Begränsningar för sql_variant

  • När du använder TVP för att fylla i en tabell med ett datetime/smalldatetime/date värde som lagras i en sql_variant fungerar det inte att anropagetDateTime()/getSmallDateTime()/getDate()en ResultSet och genererar följande undantag:

    Java.lang.String cannot be cast to java.sql.Timestamp

    Lösning: använd getString() eller getObject() i stället.

  • Det går inte att använda TVP för att fylla i en tabell och skicka ett null-värde i en sql_variant. Om du försöker göra det resulterar det i ett undantag:

    Inserting null value with column type sql_variant in TVP is not supported.