2014-10-23 3 views
1

Мне нужно поместить числа в последовательном порядке (1, 2, 3, 4 ...) в столбец таблицы. Это номера счетов, они должны быть целями, без пробелов, не повторяться. Является обязательным требованием, фактически является налоговым требованием, поэтому я не могу его пропустить.Последовательные номера - SQL Server 2008 R2

Мой текущий является Подход использовать второй «Числа» таблицу с 2 столбцами (Id, LastNumber) с одной записью на нем, Id = 1. Это то, что я делаю сейчас: 1. Выберите (LastNumber + 1) в виде числа из числа с (xlock, rowlock), где Id = 1 2. присвойте номер, сделайте другие вставки и обновления для других таблиц. 3. UPDATE Numbers установить LastNumber = @Number где Id = 1 - @ номер является номером извлекаться в шаге 1 4. Окончание сделки

Я пытаюсь использовать замок, и делать, если я не знаю, Правильно ли, что является наиболее эффективным решением для этого? Как я уже говорил выше, является обязательным требованием, номер должен быть постоянным, без пробелов, не повторяться. Таблица используется в приложении от нескольких клиентов в сети. Я использую Sql Server 2008 R2.

я нашел подобный вопрос: Sequential Invoice Numbers SQL server

решение дается там с некоторыми T-SQL кода, получить максимальное количество в таблице, но то, что произойдет, если 2 клиента называется этот код в то же время ? Будет произведено 2 повторных номера?

Thanks

+0

http://stackoverflow.com/questions/751270/best-way-to-get-the-next-id-number-without-identity это может помочь – Devesh

ответ

0

Вам понадобится сделка. Выполняя обновление, вы фактически блокируете строку из других разделяемых блокировок до завершения транзакции, а затем возвращаете новый номер.

BEGIN TRAN 
    UPDATE Numbers SET Number = Number + 1 WHERE Id = 12 
    SELECT Number FROM Numbers WHERE Id = 12 
COMMIT 
+0

Спасибо, на самом деле я использую НАЧАТЬ TRAN, как первый шаг. Я сделал ошибку и пропустил этот первый шаг, когда я написал вопрос. Но я использую его. Что вы имеете в виду, что даже если я использую подсказки для блокировки, они не будут работать? – lafirma

+0

Я не говорю, что подсказки блокировки не работают, но я обычно вижу, что они вызывают больше проблем, чем они решают. Если вы не получите их правильно, это может стать беспорядочным. Я не думаю, что они здесь нужны. Вы можете доказать, что это работает, имея 2 окна запросов, запустить start tran, а затем просто инструкцию update, а затем во втором окне попробуйте выбрать из таблицы. Если вы используете 'sp_who', вы заметите, что ваш второй запрос будет заблокирован (хотя и не блокируется), поскольку запрашиваемая общая блокировка чтения не предоставляется до тех пор, пока не будет выполнена ваша транзакция. –

Смежные вопросы