Идентичность SQL с дополняющими нулями - PullRequest
8 голосов
/ 07 августа 2010

Я пометил столбец как личность в моей таблице

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

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

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

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

Ответы [ 7 ]

15 голосов
/ 07 августа 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, и вы можете определить формат отображения любым удобным вам способом и иметь его доступным в любое время.

6 голосов
/ 07 августа 2010

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

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

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

3 голосов
/ 07 августа 2010

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

Вот несколько ссылок, которые помогут вам начать работу:

2 голосов
/ 07 августа 2010

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

1 голос
/ 13 октября 2011

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

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

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

1 голос
/ 09 августа 2010

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

declare @a int
set @a=1


select replicate('0',3-len(@a))+ cast(@a as varchar(4))
0 голосов
/ 07 августа 2010

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

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

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

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

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

...