Идентификатор автоматического запуска номера в формате хххх / год (9999/12) в хранимой процедуре SQL Server - PullRequest
0 голосов
/ 27 января 2012

У меня есть одна таблица (Stock_ID, Stock_Name). Я хочу написать хранимую процедуру в SQL Server с Stock_ID текущим номером в формате, подобном xxxx/12 (xxxx = номер начинается с 0001 до 9999; 12 - это последние 2 цифры текущего года).

Мой сценарий заключается в том, что если год изменится, текущий номер будет сброшен на 0001/13.

Ответы [ 3 ]

2 голосов
/ 27 января 2012

что вы намереваетесь делать, когда вы достигнете более 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)
1 голос
/ 30 января 2012

Это может помочь:

DECLARE @tbl TABLE(Stock_ID INT,Stock_Name VARCHAR(100))
INSERT INTO @tbl
SELECT 1,'Test'
UNION ALL
SELECT 2,'Test2'

DECLARE @ShortDate VARCHAR(2)=RIGHT(CAST(YEAR(GETDATE()) AS VARCHAR(4)),2)

;WITH CTE AS
(
    SELECT
        CAST(ROW_NUMBER() OVER(ORDER BY tbl.Stock_ID) AS VARCHAR(4)) AS RowNbr,
        tbl.Stock_ID,
        tbl.Stock_Name
    FROM
        @tbl AS tbl
)
SELECT
    REPLICATE('0', 4-LEN(RowNbr))+CTE.RowNbr+'/'+@ShortDate AS YourColumn,
    CTE.Stock_ID,
    CTE.Stock_Name
FROM
    CTE
1 голос
/ 27 января 2012

Из памяти это способ получить следующий идентификатор:

declare @maxid int
select @maxid = 0

-- if it does not have @maxid will be 0, if it was it will give the next id
select @maxid = max(convert(int, substring(Stock_Id, 1, 4))) + 1
from table
where substring(Stock_Id, 6, 2) = substring(YEAR(getdate()), 3, 2)


declare @nextid varchar(7)
select @nextid = right('0000'+ convert(varchar,@maxid),4)) + '/' + substring(YEAR(getdate()), 3, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...