Uso del tipo di dati Sql_variant

Scaricare il driver JDBC

A partire dalla versione 6.3.0, il driver JDBC supporta il tipo di dato sql_variant. Il tipo di dati sql_variant è supportato anche quando si utilizzano funzionalità come i parametri con valori di tabella e BulkCopy, con alcune limitazioni. Non tutti i tipi di dati possono essere archiviati nel tipo di dati sql_variant. Per un elenco dei tipi di dati supportati con sql_variant, vedere sql_variant (Transact-SQL).

Popolare e recuperare una tabella

Si supponga di avere una tabella con una colonna sql_variant come riportato di seguito:

CREATE TABLE sampleTable (col1 sql_variant)

Script di esempio per inserire i valori usando un'istruzione:

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

Inserimento di un valore utilizzando un'istruzione preparata:

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

Se il tipo sottostante dei dati passati è noto, è possibile usare il rispettivo setter. È ad esempio possibile usare preparedStatement.setInt() quando si inserisce un valore intero.

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

Per leggere i valori della tabella, è possibile usare i rispettivi getter. È ad esempio possibile usare i metodi getInt() o getString() se i valori provenienti dal server sono noti:

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

Utilizzo delle procedure archiviate con sql_variant

Si supponga di avere una stored procedure come riportato di seguito:

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

I parametri di output devono essere registrati:

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

Limitazioni di sql_variant

  • Quando si usa TVP per popolare una tabella con un valore datetime/smalldatetime/date memorizzato in un sql_variant, la chiamata a getDateTime()/getSmallDateTime()/getDate() su un ResultSet non funziona e genera l'eccezione seguente:

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

    Soluzione alternativa: usare invece getString() o getObject().

  • L'uso di TVP per popolare una tabella e inviare un valore NULL in un campo sql_variant non è supportato. Se si prova a eseguire questa operazione, viene generata un'eccezione:

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