從 6.3.0 版本開始,JDBC 驅動程式支援 sql_variant 資料型態。 使用資料表值參數和 BulkCopy 等功能時,也支援 Sql_variant,但有一些限制。 並非所有資料類型都可以儲存在 sql_variant 資料類型中。 如需具有 sql_variant 的支援資料類型清單,請參閱 sql_variant (Transact-SQL)。
填入及擷取資料表
假設有一個資料表,其中有一個 sql_variant 資料行如下:
CREATE TABLE sampleTable (col1 sql_variant)
使用陳述式插入值的範例指令碼:
try (Statement stmt = connection.createStatement()){
stmt.execute("insert into sampleTable values (1)");
}
使用備妥的陳述式插入值:
try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {
preparedStatement.setObject(1, 1);
preparedStatement.execute();
}
如果要傳遞之資料的底層類型為已知,便可以使用相對應 setter。 例如,可以在插入整數值時使用 preparedStatement.setInt()。
try (PreparedStatement preparedStatement = con.prepareStatement("insert into table values (?)")) {
preparedStatement.setInt (1, 1);
preparedStatement.execute();
}
若要從資料表讀取值,可以使用相對應的 getter。 例如,如果來自伺服器的值為已知,便可以使用 getInt() 或 getString() 方法:
try (SQLServerResultSet resultSet = (SQLServerResultSet) stmt.executeQuery("select * from sampleTable ")) {
resultSet.next();
resultSet.getInt(1); //or rs.getString(1); or rs.getObject(1);
}
搭配 sql_variant 的預存程序
具有如下的預存程序:
String sql = "CREATE PROCEDURE " + inputProc + " @p0 sql_variant OUTPUT AS SELECT TOP 1 @p0=col1 FROM sampleTable ";
必須註冊輸出參數:
try (CallableStatement callableStatement = con.prepareCall(" {call " + inputProc + " (?) }")) {
callableStatement.registerOutParameter(1, microsoft.sql.Types.SQL_VARIANT);
callableStatement.execute();
}
sql_variant 的限制
使用 TVP 以儲存於 sql_variant 中的
datetime/smalldatetime/date值填入資料表時,在 ResultSet 上呼叫getDateTime()/getSmallDateTime()/getDate()無法運作,且會擲出下列例外狀況:Java.lang.String cannot be cast to java.sql.Timestamp因應措施:改為使用
getString()或getObject()。不支援使用 TVP 來填入資料表,並在 sql_variant 中傳送 null 值。 嘗試這樣做會導致例外狀況:
Inserting null value with column type sql_variant in TVP is not supported.