Compartir vía


Uso del tipo de datos Sql_variant

Descargar controlador JDBC

A partir de la versión 6.3.0, el controlador JDBC admite el tipo de datos sql_variant. sql_variant también se admite al usar características como los parámetros con valores de tabla y BulkCopy, con algunas limitaciones. No todos los tipos de datos se pueden almacenar en el tipo de datos sql_variant. Para obtener una lista de los tipos de datos compatibles con sql_variant, vea sql_variant (Transact-SQL).

Rellenado y recuperación de una tabla

Suponiendo que se disponga de una tabla con una columna sql_variant como:

CREATE TABLE sampleTable (col1 sql_variant)

Un script de ejemplo para insertar valores mediante una declaración de instrucción:

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

Inserción de un valor mediante la instrucción preparada:

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

Si se conoce el tipo subyacente de los datos que se pasan, se podrá usar el establecedor correspondiente. Por ejemplo, se puede usar preparedStatement.setInt() al insertar un valor entero.

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

Para leer los valores de una tabla, se pueden usar los captadores correspondientes. Por ejemplo, se pueden usar los métodos getInt() o getString() si se conocen los valores del servidor:

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

Uso de procedimientos almacenados con sql_variant

Posesión de un procedimiento almacenado como:

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

Los parámetros de salida deben registrarse:

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

Limitaciones de sql_variant

  • Al usar TVP para rellenar una tabla con un valor datetime/smalldatetime/date almacenado en sql_variant, la llamada a getDateTime()/getSmallDateTime()/getDate() en un elemento ResultSet no funciona e inicia la siguiente excepción:

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

    Solución alternativa: use getString() o getObject() en su lugar.

  • No se admite el uso de TVP para rellenar una tabla y enviar un valor NULL en sql_variant. Si intenta hacerlo, se iniciará una excepción:

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

Consulte también

Descripción de los tipos de datos del controlador JDBC