Member 13646951 Ответов: 2

Как я могу автоматически генерируют код, который в первичный ключ, как формат, как ТС-2018-1, ТР-2018-2


Я хочу автоматически сгенерировать идентификатор ticket_Code, например TS-2018-1
ТС-2018-2
ТС-2018-3

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

Создайте таблицу [dbo].[Билет] (
[Ticket_Code] INT IDENTITY (1, 1) NOT NULL,
Ограничение [PK_Ticket] первичный ключ КЛАСТЕРИЗОВАН ([Ticket_Code] ASC)
);

CHill60

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

Member 13646951

Вы ваши правы .

2 Ответов

Рейтинг:
2

CHill60

Как отметил Йорген Андерссон, вы, вероятно, захотите заменить жестко закодированное "2018" годом, извлеченным из чего-то. Это также выглядит так, как будто вы можете начать перенумеровку для каждого года.

Что-то вроде этого работает (но предполагает, что никакие записи не будут удалены)..
Я создал и заполнил временную таблицу для демо таким образом:

create table #ticket 
(
	[No] int identity(1,1),
	[year] int
)
insert into #ticket ([year]) values
(2017),(2017),(2018),(2018),(2018),(2019),(2019)

-- NB - and some more
insert into #ticket ([year]) values
(2017),(2017),(2018),(2018),(2018),(2019),(2019)
Обратите внимание, что years не появляются в "правильном" порядке, если вы заказываете только по [No] колонка.

Такой запрос как этот:
select [No], [Year], 'TS-' + cast([year] as char(4)) + '-' + CAST(ROW_NUMBER() OVER (PARTITION BY [year] ORDER BY [No]) as varchar)
from #ticket order by [year], [No]
дал мне эти результаты:
1	2017	TS-2017-1
2	2017	TS-2017-2
8	2017	TS-2017-3
9	2017	TS-2017-4
3	2018	TS-2018-1
4	2018	TS-2018-2
5	2018	TS-2018-3
10	2018	TS-2018-4
11	2018	TS-2018-5
12	2018	TS-2018-6
6	2019	TS-2019-1
7	2019	TS-2019-2
13	2019	TS-2019-3
14	2019	TS-2019-4
или немного лучше (на мой взгляд)
;with c as ( 
   select [No], [Year], 
   ROW_NUMBER() OVER (PARTITION BY [year] ORDER BY [No]) as yno from #ticket
)
select [No], [Year], Format([Year], 'TS-####') + Format(yno, '-####') from c
Но, как я уже говорил ранее, часто такого рода манипуляции (форматирование текста и цифр) лучше всего оставить на уровне пользовательского интерфейса


Рейтинг:
19

Member 13646951

Это правильный путь-sql , и запрос выполняется.
[S.No.] INT IDENTITY (1, 1) NOT NULL,
[Ticket_Code] AS ('TS-'+right('-2018-'+CONVERT([varchar](10),[S.No.],(0)),(6))) УПОРСТВОВАВШИЙ,

Сработало !!!!!


Jörgen Andersson

Вероятно, вы могли бы обменять 2018 год на год(SYSDATETIME())