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 dati sql_variant. Il tipo di dati sql_variant è supportato anche quando si usano funzionalità come i parametri con valori di tabella e la copia bulk, 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).

Popolamento e recupero di 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 del valore usando 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);
}

Uso di stored procedure 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 un parametro con valori di tabella per popolare una tabella con un valore datetime/smalldatetime/date archiviato in un tipo sql_variant, la chiamata di getDateTime()/getSmallDateTime()/getDate() in 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 un parametro con valori di tabella per popolare una tabella e inviare un valore null in un tipo 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.

Vedi anche

Informazioni sui tipi di dati del driver JDBC