Я полностью понимаю, что имею дело с бухгалтерами, которые не хотят, чтобы номер счета-фактуры, показанный клиенту, был первичным ключом - не удивлюсь, обнаружив, что ваш "номер счета-фактуры" фактически должен быть строкой, состоящей из скажем, № клиента, за которым следует тире, затем номер их счета или что-то в этом роде. Возможно, вы могли бы использовать дополнительную таблицу, на которую вы ссылаетесь, вместо триггера вставки в вашей таблице счетов. Вам, увы, придется разрешить триггеру замедлить вставку до уровня производительности курсора; но большинство бизнес-кейсов, о которых я знаю, не будут генерировать огромное количество счетов одновременно с критическими ограничениями по времени и минутой. Вы бы сделали что-то вроде этого ...
создать таблицу invoiceNumbers (invNumber int, не нулевой идентификатор первичного ключа)
Тогда вы бы вместо таблицы вставили в таблицу счетов-фактур триггер вставки, который будет перебирать вставленную таблицу с помощью курсора; для каждой строки вставляется новая строка в invoiceNumbers, извлекается значение scope_identity (), а затем вставляется счет-фактура (с новым номером счета-фактуры) в таблицу счетов-фактур. Это замедлит вставку некоторых счетов, но вы НЕ столкнетесь с проблемой параллелизма, которая, IMHO, намного хуже, чем проблема скорости курсора, а не набора логики.