共用方式為


使用 Sql_variant 資料類型

下載 JDBC 驅動程式

自 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.

另請參閱

了解 JDBC 驅動程式資料類型