Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A partir da versão 6.3.0, o driver JDBC suporta o tipo de dado sql_variant. Sql_variant também é suportado ao utilizar funcionalidades como Table-Valued Parameters e BulkCopy, com algumas limitações. Nem todos os tipos de dados podem ser armazenados no tipo de dados
Preencher e recuperar uma tabela
Assumindo que se tem uma tabela com uma coluna sql_variant como:
CREATE TABLE sampleTable (col1 sql_variant)
Um exemplo de script para inserir valores usando a instrução:
try (Statement stmt = connection.createStatement()){
stmt.execute("insert into sampleTable values (1)");
}
Inserir valor usando uma declaração preparada:
try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {
preparedStatement.setObject(1, 1);
preparedStatement.execute();
}
Se o tipo subjacente dos dados a passar for conhecido, pode ser usado o respetivo setter. Por exemplo, preparedStatement.setInt() pode ser usado ao inserir um valor inteiro.
try (PreparedStatement preparedStatement = con.prepareStatement("insert into table values (?)")) {
preparedStatement.setInt (1, 1);
preparedStatement.execute();
}
Para ler valores da tabela, podem ser usados os respetivos getters. Por exemplo, getInt() ou getString() métodos podem ser usados se os valores provenientes do servidor forem conhecidos:
try (SQLServerResultSet resultSet = (SQLServerResultSet) stmt.executeQuery("select * from sampleTable ")) {
resultSet.next();
resultSet.getInt(1); //or rs.getString(1); or rs.getObject(1);
}
Utilização de procedimentos armazenados com sql_variant
Ter um procedimento armazenado como:
String sql = "CREATE PROCEDURE " + inputProc + " @p0 sql_variant OUTPUT AS SELECT TOP 1 @p0=col1 FROM sampleTable ";
Os parâmetros de saída devem ser registados:
try (CallableStatement callableStatement = con.prepareCall(" {call " + inputProc + " (?) }")) {
callableStatement.registerOutParameter(1, microsoft.sql.Types.SQL_VARIANT);
callableStatement.execute();
}
Limitações da sql_variant
Ao usar TVP para preencher uma tabela com um valor
datetime/smalldatetime/datearmazenado numa sql_variant, chamargetDateTime()/getSmallDateTime()/getDate()um ResultSet não funciona e gera a seguinte exceção:Java.lang.String cannot be cast to java.sql.TimestampSolução alternativa: usar
getString()ougetObject()em vez disso.Usar TVP para preencher uma tabela e enviar um valor nulo numa sql_variant não é suportado. Tentar fazer isso resulta numa exceção:
Inserting null value with column type sql_variant in TVP is not supported.