Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A partir de la versión 6.3.0, el controlador JDBC soporta el tipo de dato sql_variant. Sql_variant también es compatible al usar funciones como los parámetros con valores tabulares 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).
Rellenar y recuperar 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 con la sentencia:
try (Statement stmt = connection.createStatement()){
stmt.execute("insert into sampleTable values (1)");
}
Inserción de valores mediante una sentencia 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/datealmacenado 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.TimestampSolució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. Intentar hacerlo genera una excepción:
Inserting null value with column type sql_variant in TVP is not supported.