createMany method
Future<MssqlCreateManyResult<TRow> >
createMany(
- List<
MssqlWriteAssignments> rows, { - MssqlCreateManyStrategy strategy = MssqlCreateManyStrategy.insertValues,
- MssqlBulkOptions bulk = const MssqlBulkOptions(),
- bool atomic = true,
- bool returnRows = true,
Inserts rows, batched under SQL Server's ceilings.
atomic defaults true: more than one statement runs in one
transaction so a later batch cannot land after an earlier one
committed. A session that cannot open a transaction is refused
rather than half-writing.
Implementation
Future<MssqlCreateManyResult<TRow>> createMany(
List<MssqlWriteAssignments> rows, {
MssqlCreateManyStrategy strategy = MssqlCreateManyStrategy.insertValues,
MssqlBulkOptions bulk = const MssqlBulkOptions(),
bool atomic = true,
bool returnRows = true,
}) async {
if (rows.isEmpty) {
return MssqlCreateManyResult<TRow>(
strategy: strategy,
insertedRows: 0,
mappedToInput: true,
bulkOptions: strategy == MssqlCreateManyStrategy.bulkCopy ? bulk : null,
);
}
if (strategy == MssqlCreateManyStrategy.bulkCopy && returnRows) {
throw StateError(
'createMany(strategy: bulkCopy) cannot return stored rows: BCP '
'has no OUTPUT, and a later SELECT cannot pair them with the '
'input without an ordinal this path does not write. Pass '
'returnRows: false, or use strategy: values.',
);
}
final stamped = <MssqlWriteAssignments>[
for (final row in rows) _stampInsert(row),
];
Future<MssqlCreateManyResult<TRow>> run(MssqlSession s) {
final writer = MssqlBulkWriter<TRow>(
s,
binding: binding,
dialect: dialect,
clock: clock,
changes: changes,
scopes: scopes,
);
return switch (strategy) {
MssqlCreateManyStrategy.insertValues => writer._createManyValues(
stamped,
returnRows: returnRows,
),
MssqlCreateManyStrategy.bulkCopy => writer._createManyBulk(
stamped,
bulk,
),
};
}
final multiStatement =
strategy == MssqlCreateManyStrategy.bulkCopy || stamped.length > 1;
if (!atomic || !multiStatement) {
return run(session);
}
return _transact(run);
}