Uso del tipo de datos Sql_variant
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 agetDateTime()
/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()
ogetObject()
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.