Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
Добрый день .

Пользователь получает список из представления
нужен уникальный номер записи для отображения , генерируется он так

ALTER VIEW [dbo].[RequestVieW]
as
SELECT R.[RequestID]
      ,(right('0000' + (cast((ROW_NUMBER() OVER(PARTITION BY YEAR(CreateDate) ORDER BY  R.RequestID, CreateDate ASC )) as nvarchar(20))),5)+ '_'  +  cast((YEAR(CreateDate)) as nvarchar(4)) ) as [RequestNumber] 



Терзают смутные сомнения , может его в тригере после инсерта в таблицу писать , а не генерировать каждый раз ?!

Таблица относительно не большая , как будет дальше хз, за 4 года накопилось аж примерно 200 000 записей ....
17 июл 14, 16:15    [16319479]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Andrey1306,

к тому же есть разница между "хранить" и "генерировать каждый раз",
ибо во втором случае каждый раз могут получаться разные значения.
17 июл 14, 16:45    [16319739]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
iap,

ваш намек понятен, не понятно почему значения разные будут,

если удаления из таблицы нету и RequestID, CreateDate не правятся (это если никто не полезет руками удалять и дату менять, выключив тригера )
17 июл 14, 18:02    [16320179]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
Сформулирую тогда вопрос по другому. каким способ лучше сделать , генерацию номера для пользователя в формате NNNNNN - YYYY
то есть порядковый номер записи за год.


Предлагал ID + год , отказываются сильно сложно .......
17 июл 14, 19:22    [16320498]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Andrey1306
Терзают смутные сомнения , может его в тригере после инсерта в таблицу писать , а не генерировать каждый раз ?!
И придется сериализовать вставку в таблицу - иначе получите одинаковые номера при параллельных вставках.

Так что в итоге нужно "уникальный номер записи для отображения" или "порядковый номер записи за год"?
17 июл 14, 19:48    [16320649]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
а если вот сделать, есть смысл
раз в год джобом DBCC CHECKIDENT ('tttt', RESEED, 0); и все,



+ как видится сделать
CREATE TABLE [dbo].[tttt](
	[id] [uniqueidentifier] NOT NULL,
	[n_id] [int] IDENTITY(1,1) NOT NULL,
	[name] [nvarchar](50) NULL,
	[createdate] [datetime] NULL,
	[Number]  AS ((right('0000'+CONVERT([nvarchar](20),[n_id],0),(5))+'_')+CONVERT([nvarchar](4),datepart(year,[createdate]),(0)))
) ON [PRIMARY]



ALTER TABLE [dbo].[tttt] ADD  CONSTRAINT [DF_tttt_id]  DEFAULT (newid()) FOR [id]
GO

INSERT INTO [dbo].[tttt] ([id]           ,[name]           ,[createdate])     VALUES  (newid()           ,'name'            ,GETDATE())
INSERT INTO [dbo].[tttt] ([id]           ,[name]           ,[createdate])     VALUES  (newid()           ,'name'            ,GETDATE())
INSERT INTO [dbo].[tttt] ([id]           ,[name]           ,[createdate])     VALUES  (newid()           ,'name'            ,GETDATE())
INSERT INTO [dbo].[tttt] ([id]           ,[name]           ,[createdate])     VALUES  (newid()           ,'name'            ,GETDATE())

DBCC CHECKIDENT ('tttt', RESEED, 0);
INSERT INTO [dbo].[tttt] ([id]           ,[name]           ,[createdate])     VALUES  (newid()           ,'name'            ,GETDATE() - 400)
INSERT INTO [dbo].[tttt] ([id]           ,[name]           ,[createdate])     VALUES  (newid()           ,'name'            ,GETDATE() - 400)
INSERT INTO [dbo].[tttt] ([id]           ,[name]           ,[createdate])     VALUES  (newid()           ,'name'            ,GETDATE() - 400)
INSERT INTO [dbo].[tttt] ([id]           ,[name]           ,[createdate])     VALUES  (newid()           ,'name'            ,GETDATE() - 400)


SELECT * FROM tttt



+ минусы
единственно что привык работать с интовым идентификатором, он и в урле симпатичней смотрится, а тут будут урл или /Edit/005BA3B7-4A03-4613-835C-371177C026D4 (на пробовал даже , можно ли такой) или /Edit/00003_2013

Можно конечно для 2 второго варианта роут настройками играть
17 июл 14, 19:54    [16320681]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
uaggster
Member

Откуда:
Сообщений: 1056
Если сервер 2012 или выше - может использовать последовательности? (SEQUENCE)
Хотя как оно будет себя вести при параллельных вставках?

1. Эксклюзивно лочить таблицу (with tablock)
2. Вставлять данные из последовательности.

... с производительностью будет кошмар...
21 июл 14, 19:08    [16337446]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
uaggster,

выбрал вариант лочить таблицу в которой хранится номер ......
22 июл 14, 00:00    [16338562]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
Может действительно пока не поздно Sequence использовать .......
22 июл 14, 00:38    [16338622]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
Как-то исторически во всех таблицах с данными, которые могут потребоваться "к выдаче", первые две строки:
 RowId bigint identity (0,1)
,RowTime datetime default getdate()


По RowId можно ссылаться, по RowTime можно смотреть/прикидывать "когда что". Остальное (кто добавлял, кто последним изменял, журналирование, дата последнего изменения и т.д....) - по вкусу и потребностям.

PS А зачем каждый раз генерировать одно и тоже? Ну, если только ради экономии 8 байт на запись?... Типа, процессорное время по нынешним временам них-я не стоит...
22 июл 14, 05:56    [16338777]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
SIMPLicity_
Как-то исторически во всех таблицах с данными, которые могут потребоваться "к выдаче", первые две строки:
 RowId bigint identity (0,1)
,RowTime datetime default getdate()


По RowId можно ссылаться, по RowTime можно смотреть/прикидывать "когда что". Остальное (кто добавлял, кто последним изменял, журналирование, дата последнего изменения и т.д....) - по вкусу и потребностям.

PS А зачем каждый раз генерировать одно и тоже? Ну, если только ради экономии 8 байт на запись?... Типа, процессорное время по нынешним временам них-я не стоит...


все так и есть, но вот приспичило заказчику порядковый номер .....
22 июл 14, 09:51    [16339204]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Andrey1306,

порядковый номер в списке ВСЕГДА формирует клиент. Сервер никто такой ерундой не нагружает.
22 июл 14, 11:16    [16339733]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
Владислав Колосов
Andrey1306,

порядковый номер в списке ВСЕГДА формирует клиент. Сервер никто такой ерундой не нагружает.


Шутите ..... откуда же клиент знает о такой информации .....

я сделал по мотивам вот этого сообщения

7173098

но терзают меня сомнения
22 июл 14, 12:48    [16340479]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Andrey1306
я сделал по мотивам вот этого сообщения

7173098
Там жуткий говнокод...

Andrey1306
но терзают меня сомнения
Пока четко не скажете, что же вам в действительности нужно, - помочь очень затруднительно.
22 июл 14, 12:53    [16340523]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
invm,

Нужно пользователю показывать,
номер документа в формате NNNNNNNN-YYYY, где YYYY - год, NNNNNNNN - порядковый номер документа в этом году.

и с нового года обнуление номеров
22 июл 14, 13:05    [16340613]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Andrey1306
NNNNNNNN - порядковый номер документа в этом году.
"Дыры" в нумерации допустимы?
22 июл 14, 13:13    [16340660]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
invm,

Желательно избежать, это не оговаривалось. Но если будут дыры вопрос возникнет )
22 июл 14, 13:17    [16340684]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Andrey1306
это не оговаривалось
Ну так оговорите, т.к. эффективное решение зависит от этого момента. Тем более, что при удалении строк "дыры" все равно появятся.
22 июл 14, 13:26    [16340766]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
invm,

Удаления строк не будет
22 июл 14, 13:32    [16340802]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Andrey1306
invm,

Удаления строк не будет
Мамой клянётесь?
22 июл 14, 13:37    [16340848]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
iap
Andrey1306
invm,

Удаления строк не будет
Мамой клянётесь?


)))

Удаление, разве какой хххх сделает , висит триггер удалять не дает
22 июл 14, 13:40    [16340868]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
Andrey1306
iap
пропущено...
Мамой клянётесь?


)))

Удаление, разве какой хххх сделает , висит триггер удалять не дает

Но DBA-то может? Например, залогинившись под sa (его, правда уже почти нет)... Как же в жизни без "закладок"... ;-)

PS А что будет при вставке записи (задним числом)? Или это тоже "мамой" оговаривается?
22 июл 14, 13:49    [16340924]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
SIMPLicity_,

Дата создания , не меняется , задним чистом ничего не вводится
22 июл 14, 13:50    [16340928]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
Andrey1306
Member

Откуда: Киев
Сообщений: 2611
Из всего сказано, я понял что это не реально сделать по феншую ?!

Варианту с таблицей, в которой хранится номер (ссылка выше) , присвоили статус говнокода,
вариант апдейтить таблицу в тригере после вставки туда же ....
23 июл 14, 12:35    [16346008]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз о генерации строкового уникального номера  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Andrey1306
Из всего сказано, я понял что это не реально сделать по феншую ?!
Желаемое можно сделать сериализовав вставку данных в таблицу. Если для вас это приемлемо, можете делать любым понравившимся способом.
23 июл 14, 13:23    [16346383]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить