что вы намереваетесь делать, когда вы достигнете более 9999 за один год ??? это может показаться невозможным, но мне приходилось сталкиваться с таким большим количеством путаниц, связанных с дизайном данных, которые «никогда не произойдут» в течение многих лет от разработчиков кода сначала, позже разработчики. Это основные проблемы в зависимости от того, как могут быть места, в которых нужно исправить эти элементы, которые обычно являются первичным ключом, а внешние ключи используются повсеместно.
Это похоже на системное требование ПОКАЗАТЬ данные таким образом, но разработчики несут ответственность за разработку внутренних компонентов приложения. То, как вы храните и отображаете его, не должно быть идентичным. Я бы разделил это на два столбца, используя int для числовой части и крошечное int для двухзначной части года. Вы можете использовать вычисляемый столбец для быстрого и удобного отображения (сохраните его и при необходимости внесите в указатель), где вы дополняете начальными нулями и добавляете косую черту. Добавьте ограничение проверки для части года, чтобы убедиться, что она находится в разумных пределах. Вы можете сделать часть номера удостоверением личности и просто сделать так, чтобы задание возвращалось к единице каждый канун нового года.
попробуйте:
--drop table YourTable
--create the basic table
CREATE TABLE YourTable
(YourNumber int identity(1,1) not null
,YourYear tinyint not null
,YourData varchar(10)
,CHECK (YourYear>=12 and YourYear<=25) --optional check constraint
)
--add the persisted computed column
ALTER TABLE YourTable ADD YourFormattedNumber AS ISNULL(RIGHT('0000'+CONVERT(varchar(10),YourNumber),4)+'/'+RIGHT(CONVERT(varchar(10),YourYear),2),'/') PERSISTED
--make the persisted computed column the primary key
ALTER TABLE YourTable ADD CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED (YourFormattedNumber)
пример данных:
--insert rows in 2012
insert into YourTable values (12,'aaaa')
insert into YourTable values (12,'bbbb')
insert into YourTable values (12,'cccc')
--new years eve job run this
DBCC CHECKIDENT (YourTable, RESEED, 0)
--insert rows in 2013
insert into YourTable values (13,'aaaa')
insert into YourTable values (13,'bbbb')
select * from YourTable order by YourYear,YourNumber
ВЫВОД:
YourNumber YourYear YourData YourFormattedNumber
----------- -------- ---------- -------------------
1 12 aaaa 0001/12
2 12 bbbb 0002/12
3 12 cccc 0003/12
1 13 aaaa 0001/13
2 13 bbbb 0002/13
(5 row(s) affected)
для обработки более чем 9999 строк в год попробуйте другой вычисленный вычисляемый столбец:
CREATE TABLE YourTable
(YourNumber int identity(9998,1) not null --<<<notice the identity starting point, so it hits 9999 quicker for this simple test
,YourYear tinyint not null
,YourData varchar(10)
)
--handles more than 9999 values per year
ALTER TABLE YourTable ADD YourFormattedNumber AS ISNULL(RIGHT(REPLICATE('0',CASE WHEN LEN(CONVERT(varchar(10),YourNumber))<4 THEN 4 ELSE 1 END)+CONVERT(varchar(10),YourNumber),CASE WHEN LEN(CONVERT(varchar(10),YourNumber))<4 THEN 4 ELSE LEN(CONVERT(varchar(10),YourNumber)) END)+'/'+RIGHT(CONVERT(varchar(10),YourYear),2),'/') PERSISTED
ALTER TABLE YourTable ADD CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED (YourFormattedNumber)
пример данных:
insert into YourTable values (12,'aaaa')
insert into YourTable values (12,'bbbb')
insert into YourTable values (12,'cccc')
DBCC CHECKIDENT (YourTable, RESEED, 0) --new years eve job run this
insert into YourTable values (13,'aaaa')
insert into YourTable values (13,'bbbb')
select * from YourTable order by YourYear,YourNumber
ВЫВОД:
YourNumber YourYear YourData YourFormattedNumber
----------- -------- ---------- --------------------
9998 12 aaaa 9998/12
9999 12 bbbb 9999/12
10000 12 cccc 10000/12
1 13 aaaa 0001/13
2 13 bbbb 0002/13
(5 row(s) affected)