SQL Server JDBCでテーブル値パラメータ(TVP)を使用する方法については、私は、Microsoftが提供するSQL Serverドライバのバージョン6.0を使用しています、と私はofficial documentationだけでなく、より多くの有用な例を検討しているSQL Server JDBCでテーブル値パラメータを使用する
How to pass Table-Valued parameters from java to sql server stored procedure?
示しConnection.prepareStatement
からSQLServerPreparedStatement
キャストオブジェクトを取得の両方の例電話をかけてsetStructured
メソッドに電話をかけてください。これにより、DBCP2などの標準接続プールの使用が妨げられないでしょうか?
私は代わりにstmt.setObject
メソッドを使用することができるかもしれないと言って、他のスタックオーバーフローのコメントからのコメントに気づい:PreparedStatementをキャストする代わりに
を、あなたはPreparedStatementのにSQLServerDataTableインスタンスを渡すことができます。 setObject(int、Object)メソッドです。これは、dboスキーマで定義されたTVPタイプに対して機能しました。 - 19時18分
でallenru 7月15日私はこれをしようとしたとき、私はエラーを得て、タイプはdboスキーマでですが...
Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: The Table-Valued Parameter must have a valid type name.
はここに私のコードです:
// JAVA
private static void tableParameters(DataSource ds) throws SQLException {
final String sql = "EXEC dbo.GetAccountsFromTable @accountIds=?";
final List<Integer> accountIds = generateIntegers(50, 1_000_000);
try (Connection conn = ds.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql))
{
SQLServerDataTable accounts = new SQLServerDataTable();
accounts.addColumnMetadata("item", java.sql.Types.INTEGER);
for (Integer aid : accountIds)
accounts.addRow(aid.toString());
stmt.setObject(1, accounts);
try (ResultSet rs = stmt.executeQuery())
{
while (rs.next()) {
System.out.println(rs.getInt(1));
}
}
}
}
-- TSQL
create type dbo.IntegerTable AS TABLE (item INT);
CREATE PROCEDURE dbo.GetAccountsFromTable(@accountIds dbo.IntegerTable READONLY)
AS
BEGIN
IF OBJECT_ID('tempdb..#AccountIds') IS NOT NULL
DROP TABLE #AccountIds
CREATE TABLE #AccountIds (id INTEGER)
INSERT INTO #AccountIds
SELECT * FROM @accountIds
SELECT * FROM #AccountIds
END
ご迷惑をおかけして申し訳ございません。ありがとう!