Partager via


Utilisation du type de données SQL_variant

Télécharger le pilote JDBC

À compter de la version 6.3.0, le pilote JDBC prend en charge le type de données sql_variant. sql_variant est également pris en charge avec des fonctionnalités comme les paramètres table et la copie en bloc, avec quelques limitations. Tous les types de données ne peuvent pas être stockés dans le type de données sql_variant. Pour connaître la liste des types de données pris en charge avec sql_variant, consultez sql_variant (Transact-SQL).

Remplissage et extraction d’une table

En supposant qu’il existe une table avec une colonne sql_variant comme suit :

CREATE TABLE sampleTable (col1 sql_variant)

Exemple de script pour insérer des valeurs à l’aide d’une instruction :

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

Insertion d’une valeur à l’aide d’une instruction préparée :

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

Si le type sous-jacent des données passées est connu, vous pouvez utiliser la méthode setter respective. Par exemple, vous pouvez utiliser preparedStatement.setInt() lors de l’insertion d’une valeur entière.

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

Pour la lecture des valeurs à partir de la table, les getters respectifs peuvent être utilisés. Par exemple, les méthodes getInt() ou getString() peuvent être utilisées si les valeurs provenant du serveur sont connues :

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

Utilisation de procédures stockées avec sql_variant

Disposer d’une procédure stockée telle que :

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

Les paramètres de sortie doivent être enregistrés :

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

Limitations de sql_variant

  • Quand vous utilisez des paramètres table pour remplir une table avec une valeur datetime/smalldatetime/date stockée dans un sql_variant, l’appel de getDateTime()/getSmallDateTime()/getDate() sur un ResultSet ne fonctionne pas et lève l’exception suivante :

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

    Solution de contournement : utilisez getString() ou getObject() à la place.

  • Il n’est pas possible d’utiliser des paramètres table pour remplir une table et envoyer une valeur Null dans un sql_variant, car cela produit une exception :

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

Voir aussi

Présentation des types de données du pilote JDBC