使用 Sql_variant 資料類型
自 6.3.0 版起,JDBC 驅動程式會支援 sql_variant 資料類型。 在使用資料表值參數與大量複製等功能的情況下,也會支援 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 的限制
搭配儲存於 sql_variant 中的
datetime
/smalldatetime
/date
值以使用 TVP 來填入資料表時,在 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.