Каков наилучший способ вставить номер счета (без пропуска) в таблицу - PullRequest
0 голосов
/ 03 января 2019

Я работаю над проектом продаж с использованием SQL Server (версии 2008 и 2012).Мне нужно вставить данные о продажах в таблицу и создать номер счета для этих данных.Я сделал это, установив свой столбец invoiceNumber как столбец идентификаторов, который увеличивается на единицу.

Но теперь у нас есть требование, чтобы в номере нашего счета-фактуры не было разрыва между ними (если счет не удален. Удаленный счет-фактура будет храниться в отдельных таблицах).

Столбцы идентификаторов теряют номера счетов при сбое транзакции.Начиная с SQL Server 2012, он может увеличиваться на 1000 при перезапуске сервера.Чтобы избавиться от этой проблемы, я вынужден использовать операторы INSERT SELECT, как показано ниже

INSERT INTO SalesTable(InvoiceNumber, col1, col2) 
VALUES ((SELECT MAX(SalesId) FROM SalesTable + 1), value1, value2)

Это может работать нормально, если мое программное обеспечение работает на одной машине.

Мой вопрос: если я использую этот код в своем программном обеспечении, когда несколько пользователей одновременно создают накладные по продажам, есть ли возможность для двух накладных получить один и тот же номер накладной?Я имею в виду своего рода дублирование номера счета?

Предотвратит ли проблема использование блокировки таблицы перед вставкой данных?если да как это сделать?Какие проблемы связаны с использованием блокировок?

Я нашел похожие вопросы, но не нашел ответа, чтобы решить эту проблему наилучшим образом.

Любая помощь по этому вопросу будет принята с благодарностью.Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Можно попробовать свойство идентификатора столбца на сервере Sql, чтобы получить номер автоматического приращения с предоставленной вами последовательностью, такой как 1. Этот номер можно комбинировать с некоторым префиксом, таким как INV001, INV002 и т. Д.

Здесь вы можете узнать об идентичности в SQL Server - IDENITY

0 голосов
/ 03 января 2019

Вы можете использовать SEQUENCES , созданный с опцией NO_CACHE, но это не гарантирует отсутствие пробелов из-за ошибок в вашем приложении.

Как общий совет, создавайте свои счета в «черновом» состоянии, где все сохраняется в базе данных и фиксируется. Затем «завершите» эти счета-фактуры, сгенерировав их количество.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...