Mohamed Sultan Ответов: 3

Получить max + 1 без удаления нулей в SQL server


Привет,
У меня есть поле varchar, содержащее числа в таком формате "00001", "00002" и т. д
когда я пытаюсь получить следующее число, используя Max (поле) + 1, я получаю целое число "3", например.
как я могу получить resutl "00003" вместо "3"?

Спасибо.

Что я уже пробовал:

Ответ измените комментарий. Удалите комментарий.
вот рабочий пример, который я только что понял, но я думаю, что должен быть более простой способ:
Выберите верхний (1) { ФН повтор(0, лен(идентификатор элемента) - лен(максимум(идентификатор элемента) + 1)) } + литье(максимум(идентификатор элемента) + 1 Как varchar(7)) как Выражение1
от предметов
Группа по Itemid свойства
Приказ идентификатор элемента по убыванию
последний запрос дает правильный результат " 0004916"

3 Ответов

Рейтинг:
2

OriginalGriff

Чтобы сделать это, вам нужно преобразовать его в целое число, увеличить его и преобразовать обратно в строку:

SELECT RIGHT('00000' + CONVERT(VARCHAR, MAX(CONVERT(INT,Field)) + 1), 5) FROM MyTable
Но ... вам гораздо лучше иметь поле идентификатора, которое является целочисленным, и позволить SQL обрабатывать приращение, а затем преобразовывать его в строку с начальным нулем, когда вам это нужно.
Один из способов сделать это-использовать вычисляемый столбец:
CREATE TABLE [dbo].[MyTable](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Field]  AS (RIGHT('00000'+CONVERT([VARCHAR],[Id],(0)),(5))),
	[Desc] [nchar](10) NOT NULL
) ON [PRIMARY]
GO

Таким образом, "последнее значение" будет создано для вас при вставке строки, а ведущая нулевая версия sting будет создана автоматически.


Рейтинг:
2

Dave Kreskowiak

Проблема с тем, что вы делаете, заключается в том, что он может и потерпит неудачу в многопользовательской среде.

Вы должны использовать SELECT, чтобы получить текущее верхнее значение, а затем INSERT, чтобы поместить следующее число в таблицу. Проблема в том, что если второй клиент выполнит SELECT до того, как первый клиент доберется до INSERT? У вас вдруг есть два клиента, пользующиеся одним и тем же номером.

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


Рейтинг:
1

Garth J Lancaster

вы не опубликовали никакого кода - так что немного трудно помочь ... Я скажу это, я постоянно поражаюсь тому, что компьютерные ученые сегодня не различают

а) как число хранится в памяти
Б) как номер хранится в базе данных
в) как число может быть представлено для потребления человеком - в данном случае я имею в виду ведущие нули и т. д.

взгляните на Как: дополнить число ведущими нулями[^]


Mohamed Sultan

вот рабочий пример, который я только что понял, но я думаю, что должен быть более простой способ:
Выберите верхний (1) { ФН повтор(0, лен(идентификатор элемента) - лен(максимум(идентификатор элемента) + 1)) } + литье(максимум(идентификатор элемента) + 1 Как varchar(7)) как Выражение1
Из предметов
Группа по Itemid свойства
Приказ идентификатор элемента по убыванию
последний запрос дает правильный результат " 0004916"