Идентификатор SQL с начальными дополненными нулями

Я пометил столбец как Identity в своей таблице

create table Identitytest(
    number int  identity(1,001) not null,
    value varchar(500)
)

Мне нужно, чтобы столбец идентификаторов увеличивался как 001,002,003 и т. д.

База данных показывает, что она вставляется как 1,2,3 и т. д.

Как это может быть сделано?


person Innova    schedule 07.08.2010    source источник
comment
Почему за это проголосовали? Вопрос был ясен и на него можно было ответить.   -  person kbrimington    schedule 07.08.2010
comment
Я знаю, что вам, вероятно, все равно, но я извиняюсь за свои предыдущие комментарии и удаляю их (кроме первого до того, как я расстроился). Я был не в духе, и мне очень жаль.   -  person David    schedule 07.08.2010
comment
Здесь на stackoverflow был дан ответ: stackoverflow.com/questions/611340/   -  person sumit sharma    schedule 22.02.2016
comment
это работает только до 999, после этого, если у вас есть число 1000, то это приводит к 000, а 1001 приводит к 001   -  person Mohammed Dawood Ansari    schedule 26.07.2016


Ответы (7)


Если вы хотите отобразить столбец number с ведущими нулями, просто добавьте его в оператор SELECT. Это число, оно НЕ будет храниться с ведущими нулями как целое число.

SELECT RIGHT('00000' + CAST([number] AS varchar(5)) , 3)
FROM IdentityTest

3 - это количество символов, которое вы хотите вывести на выходной дисплей.

person p.campbell    schedule 07.08.2010
comment
+1. Я полагаю, что было полезнее показать, как добиться желаемого отображения, чем дразнить его за то, что он не понимает чисел. - person David; 07.08.2010
comment
спасибо за ответ, но мне нужно сохранить его в базе данных в формате 001 вместо 1,2... - person Innova; 07.08.2010
comment
@Ranjana: зачем это нужно хранить? Кто потребляет это, кто не может воспользоваться небольшим кастингом и форматированием? - person p.campbell; 07.08.2010
comment
Разве вы не имеете в виду || вместо +? - person dan04; 07.08.2010

Как уже справедливо указывали другие, INT никогда не имеет начальных нулей - он просто содержит значение, вот и все (и это хорошо).

Если вам нужно дополнительное форматирование, вы всегда можете добавить в свою таблицу вычисляемый столбец, например:

ALTER TABLE dbo.Identitytest
  ADD DisplayNumber AS  RIGHT('000' + CAST(number AS VARCHAR(3)) , 3) PERSISTED

Таким образом, ваш INT IDENTITY будет использоваться как INT и всегда будет содержать числовое значение, в то время как DisplayNumber содержит 001, 002, ... 014, 015, ..... и т. д. - автоматически, всегда в актуальном состоянии.

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

SELECT value FROM dbo.IdentityTest WHERE DisplayNumber = '024'

И, конечно же, вы можете использовать практически любое форматирование в определении вашего вычисляемого столбца, поэтому вы также можете добавить префикс или что-то в этом роде:

ALTER TABLE dbo.Identitytest
  ADD DisplayNumber 
      AS  'ABC-' + RIGHT('000' + CAST(number AS VARCHAR(3)) , 3) PERSISTED

Так что в этом случае ваш DisplayNumber будет ABC-001, ABC-002, ... и так далее.

Вы получаете лучшее из обоих миров — вы сохраняете свой INT IDENTITY, который является числовым и автоматически увеличивается SQL Server, и вы можете определить формат отображения любым удобным вам способом, и он будет доступен в любое время.

person marc_s    schedule 07.08.2010

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

Вот несколько ссылок для начала:

person kbrimington    schedule 07.08.2010

Зачем тебе это надо? Как целое число, 001 совпадает с 1. Если вам нужно это для отображения или других целей, создайте другой столбец и выполняйте свою работу там (вы можете сделать это как часть триггера в таблице, при вставке, который выглядит во вновь вставленной строке и соответствующим образом создает запись в столбце.

person Noon Silk    schedule 07.08.2010
comment
Правильно.. Это вопрос форматирования вывода. Это уже второй такой вопрос за последние два дня.. Для программиста не понять, что 001 это то же самое, что и 1 просто страшно. Другой парень хотел хранить даты в типе данных DateTime без миллисекунд, чтобы они не отображались при использовании .ToString(). Шиш. - person David; 07.08.2010
comment
+1. Это, безусловно, проблема с отображением, а не с памятью. @Ranjana: клиент должен нести ответственность за заполнение. - person p.campbell; 07.08.2010
comment
Зачем тебе хранить это? вы можете просто создать представление в таблице с логикой для заполнения целого числа соответствующим образом, а затем сослаться на представление и сделать это. - person DForck42; 09.08.2010

у меня есть таблица, в которой я храню целое число, но пользователи хотят видеть это как XXX, даже если оно содержит нули, поэтому я написал этот код

declare @a int
set @a=1


select replicate('0',3-len(@a))+ cast(@a as varchar(4))
person DForck42    schedule 09.08.2010

Вот еще один метод:

create table TEST_T (ui int NOT NULL identity, name varchar(10))
insert into TEST_T values ( 'FRED' )
select NAME, ui, RIGHT('0000' + LTRIM(STR(ui)), 4) as ui_T from TEST_T
go
/* NOTE: A view could be created with a calculated column instead of the identity column. */
create view TEST_V as select NAME, RIGHT('0000' + LTRIM(STR(ui)), 4) as ui_V from TEST_T go
go
select * from TEST_V
drop view TEST_V
drop table TEST_T

Не так много дублирования данных (?), как добавление столбца в таблицу, и нет необходимости указывать столбец в операторе выбора.

person Robert Christopher    schedule 13.10.2011

Мне нужно, чтобы столбец идентификаторов увеличивался до 001 002 003 и т. д.

База данных показывает, что она вставляется как 1,2,3 и т.д.

Базы данных SQL хранят значения, а не литералы, которые вы использовали для записи этих значений. 002 есть 2. Точно так же, как 1 + 1 есть 2. Можно ли ожидать, что SELECT 1 + 1 будет отображать строку "1 + 1" вместо 2?

Если вы хотите, чтобы в вашем столбце сохранялись начальные нули, вы должны использовать символьный тип. Но тогда вы не сможете использовать AUTOINCREMENT/IDENTITY.

Скорее всего, вам на самом деле нужно что-то вроде printf("%03d", number) в программе, которая читает из базы данных.

person dan04    schedule 07.08.2010