fix: adjust batch size for SQL Server parameter limit (2100 max params)
- SQL Server has a maximum of 2100 parameters per query - Each record has 28 columns, so max batch is ~71 records (2000/28) - Fixed syntax error: removed extra closing brace in extractor.ts - Added debug logging for batch insert parameters
This commit is contained in:
@@ -443,7 +443,7 @@ export class DiscreteMaterialPlanDAO {
|
|||||||
/**
|
/**
|
||||||
* Insert records in batches
|
* Insert records in batches
|
||||||
* @param records - List of MaterialPlanRecord to insert
|
* @param records - List of MaterialPlanRecord to insert
|
||||||
* @param batchSize - Number of records per batch (default: 1000)
|
* @param batchSize - Number of records per batch (default: 1000, auto-adjusted for SQL Server)
|
||||||
* @returns Number of records inserted
|
* @returns Number of records inserted
|
||||||
*/
|
*/
|
||||||
async batchInsert(records: MaterialPlanRecord[], batchSize = 1000): Promise<number> {
|
async batchInsert(records: MaterialPlanRecord[], batchSize = 1000): Promise<number> {
|
||||||
@@ -457,21 +457,38 @@ export class DiscreteMaterialPlanDAO {
|
|||||||
const isSqlServer = dbService.type === 'sqlserver'
|
const isSqlServer = dbService.type === 'sqlserver'
|
||||||
let totalInserted = 0
|
let totalInserted = 0
|
||||||
|
|
||||||
|
// SQL Server has a limit of 2100 parameters per query
|
||||||
|
// Each record has 28 columns, so max rows per batch = 2100 / 28 = 75
|
||||||
|
// Leave some margin for query overhead
|
||||||
|
const columnsPerRow = 28
|
||||||
|
const sqlServerMaxParams = 2000
|
||||||
|
const effectiveBatchSize = isSqlServer
|
||||||
|
? Math.min(batchSize, Math.floor(sqlServerMaxParams / columnsPerRow))
|
||||||
|
: batchSize
|
||||||
|
|
||||||
|
log.info('Batch insert parameters', {
|
||||||
|
isSqlServer,
|
||||||
|
dbType: dbService.type,
|
||||||
|
columnsPerRow,
|
||||||
|
effectiveBatchSize,
|
||||||
|
totalRecords: records.length
|
||||||
|
})
|
||||||
|
|
||||||
// Process in batches
|
// Process in batches
|
||||||
for (let i = 0; i < records.length; i += batchSize) {
|
for (let i = 0; i < records.length; i += effectiveBatchSize) {
|
||||||
const batch = records.slice(i, i + batchSize)
|
const batch = records.slice(i, i + effectiveBatchSize)
|
||||||
const inserted = await this.insertBatch(dbService, tableName, batch, isSqlServer)
|
const inserted = await this.insertBatch(dbService, tableName, batch, isSqlServer)
|
||||||
totalInserted += inserted
|
totalInserted += inserted
|
||||||
|
|
||||||
log.debug('Inserted batch', {
|
log.debug('Inserted batch', {
|
||||||
batch: Math.floor(i / batchSize) + 1,
|
batch: Math.floor(i / effectiveBatchSize) + 1,
|
||||||
count: inserted
|
count: inserted
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
log.info('Batch insert completed', {
|
log.info('Batch insert completed', {
|
||||||
totalInserted,
|
totalInserted,
|
||||||
batchSize
|
batchSize: effectiveBatchSize
|
||||||
})
|
})
|
||||||
|
|
||||||
return totalInserted
|
return totalInserted
|
||||||
@@ -498,12 +515,34 @@ export class DiscreteMaterialPlanDAO {
|
|||||||
|
|
||||||
// Build column list (excluding id)
|
// Build column list (excluding id)
|
||||||
const columns = [
|
const columns = [
|
||||||
'Factory', 'MaterialStatus', 'PlanNumber', 'SourceNumber', 'MaterialType',
|
'Factory',
|
||||||
'ProductCode', 'ProductName', 'ProductUnit', 'ProductPlanQuantity',
|
'MaterialStatus',
|
||||||
'UseDepartment', 'Remark', 'Creator', 'CreateDate', 'Approver', 'ApproveDate',
|
'PlanNumber',
|
||||||
'SequenceNumber', 'MaterialCode', 'MaterialName', 'Specification', 'Model',
|
'SourceNumber',
|
||||||
'DrawingNumber', 'MaterialQuality', 'PlanQuantity', 'Unit', 'RequiredDate',
|
'MaterialType',
|
||||||
'Warehouse', 'UnitUsage', 'CumulativeOutputQuantity'
|
'ProductCode',
|
||||||
|
'ProductName',
|
||||||
|
'ProductUnit',
|
||||||
|
'ProductPlanQuantity',
|
||||||
|
'UseDepartment',
|
||||||
|
'Remark',
|
||||||
|
'Creator',
|
||||||
|
'CreateDate',
|
||||||
|
'Approver',
|
||||||
|
'ApproveDate',
|
||||||
|
'SequenceNumber',
|
||||||
|
'MaterialCode',
|
||||||
|
'MaterialName',
|
||||||
|
'Specification',
|
||||||
|
'Model',
|
||||||
|
'DrawingNumber',
|
||||||
|
'MaterialQuality',
|
||||||
|
'PlanQuantity',
|
||||||
|
'Unit',
|
||||||
|
'RequiredDate',
|
||||||
|
'Warehouse',
|
||||||
|
'UnitUsage',
|
||||||
|
'CumulativeOutputQuantity'
|
||||||
]
|
]
|
||||||
|
|
||||||
// Build parameterized insert
|
// Build parameterized insert
|
||||||
|
|||||||
@@ -281,7 +281,6 @@ export class ExtractorService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Import merged Excel data to database
|
* Import merged Excel data to database
|
||||||
|
|||||||
Reference in New Issue
Block a user