mirror of
https://github.com/n8n-io/n8n.git
synced 2024-09-11 13:15:28 +03:00
fix(Microsoft SQL Node): Prevent MSSQL max parameters error by chunking (#8390)
This commit is contained in:
parent
d2b3c1048e
commit
1b0ba2c028
@ -120,11 +120,34 @@ const escapeTableName = (table: string) => {
|
||||
}
|
||||
};
|
||||
|
||||
const MSSQL_PARAMETER_LIMIT = 2100;
|
||||
|
||||
export function mssqlChunk(rows: IDataObject[]): IDataObject[][] {
|
||||
const chunked: IDataObject[][] = [[]];
|
||||
let currentParamCount = 0;
|
||||
|
||||
for (const row of rows) {
|
||||
const rowValues = Object.values(row);
|
||||
const valueCount = rowValues.length;
|
||||
|
||||
if (currentParamCount + valueCount >= MSSQL_PARAMETER_LIMIT) {
|
||||
chunked.push([]);
|
||||
currentParamCount = 0;
|
||||
}
|
||||
|
||||
chunked[chunked.length - 1].push(row);
|
||||
|
||||
currentParamCount += valueCount;
|
||||
}
|
||||
|
||||
return chunked;
|
||||
}
|
||||
|
||||
export async function insertOperation(tables: ITables, pool: mssql.ConnectionPool) {
|
||||
return await executeQueryQueue(
|
||||
tables,
|
||||
({ table, columnString, items }: OperationInputData): Array<Promise<object>> => {
|
||||
return chunk(items, 1000).map(async (insertValues) => {
|
||||
return mssqlChunk(items).map(async (insertValues) => {
|
||||
const request = pool.request();
|
||||
|
||||
const valuesPlaceholder = [];
|
||||
|
@ -4,6 +4,7 @@ import {
|
||||
configurePool,
|
||||
deleteOperation,
|
||||
insertOperation,
|
||||
mssqlChunk,
|
||||
updateOperation,
|
||||
} from '../GenericFunctions';
|
||||
|
||||
@ -142,4 +143,15 @@ describe('MSSQL tests', () => {
|
||||
expect(querySpy).toHaveBeenCalledWith('DELETE FROM [users] WHERE [id] IN (@v0);');
|
||||
assertParameters({ v0: 2 });
|
||||
});
|
||||
|
||||
describe('mssqlChunk', () => {
|
||||
it('should chunk insert values correctly', () => {
|
||||
const chunks = mssqlChunk(
|
||||
new Array(3000)
|
||||
.fill(null)
|
||||
.map((_, index) => ({ id: index, name: 'John Doe', verified: true })),
|
||||
);
|
||||
expect(chunks.map((chunk) => chunk.length)).toEqual([699, 699, 699, 699, 204]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user