createMany method

Future<MssqlCreateManyResult<TRow>> createMany(
  1. List<MssqlWriteAssignments> rows, {
  2. MssqlCreateManyStrategy strategy = MssqlCreateManyStrategy.insertValues,
  3. MssqlBulkOptions bulk = const MssqlBulkOptions(),
  4. bool atomic = true,
  5. 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);
}