SQL Server
Microsoft リレーショナル データベース管理分析システムのファミリで、電子商取引、基幹業務、データ ウェアハウジングなどのソリューションで使用されています。
45 件の質問
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
複数行INSERTをするSQLで、Decimal型のカラムにNULLをINSERTすると、他のカラムの小数桁部分が四捨五入されるという問題が発生しています。 以下のテーブルを作成し、prepareStatementで記述したSQLを実行すると、[実行結果] のように、1.222は1、1.55は2 のように小数桁部分が四捨五入されてしまいます。
[テーブル]
CREATE TABLE [dbo].[test_decimal] (
[id] bigint identity NOT NULL ,
[col_decimal] decimal(6,3)
PRIMARY KEY ([id])
);
[コード]
public static void main(String[] args) throws Exception {
var connectionString = "jdbc:sqlserver://ホスト名:1433;databaseName=DB名;"
+ "encrypt=true;trustServerCertificate=true;calcBigDecimalPrecision=true;";
var username = "ユーザー名";
var password = "パスワード";
var sql = "insert into test_decimal values(?,?),(?,?),(?,?)";
try (var con = DriverManager.getConnection(connectionString, username, password);
var pstmt = con.prepareStatement(sql)) {
pstmt.setInt(1, 1);
pstmt.setBigDecimal(2, new BigDecimal("1.222").setScale(3));
pstmt.setInt(3, 2);
pstmt.setBigDecimal(4, null);
pstmt.setInt(5, 3);
pstmt.setBigDecimal(6, new BigDecimal("1.555").setScale(3));
pstmt.execute();
}
}
[実行結果] id col_decimal 1 1.000 2 NULL 3 2.000
上記の事象は JDBC Driver の仕様なのでしょうか?また、回避する方法などはありますでしょうか?