Создать уникальное значение последовательности столбцов на основе параллелизма обработки запросов - PullRequest
0 голосов
/ 10 октября 2019

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

Шаблон для уникального значения: CustomerName-Month-Year-SupportTicketForThisMonthCount.

Таким образом, скрипт должен автоматически сгенерировать:

  • AcmeCo-10-2019-1
  • AcmeCo-10-2019-2
  • AcmeCo-10-2019-3

и т. Д. В качестве поддержкибилеты созданы. Как можно гарантировать, что AcmeCo-10-2019-1 не будет сгенерирован дважды, если для AcmeCo созданы одновременно два билета поддержки?

insert into SupportTickets (name)
  select concat_ws('-', @CustomerName, @Month, @Year, COUNT())
  from SupportTickets
  where customerName = @CustomerName
  and CreatedDate between @MonthStart and @MonthEnd;

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Одна возможность:

Создать таблицу счетчиков:

create table Counter (
   Id int identify(1,1),
   Name varchar(64)
   Count1 int
)

Имя - это уникальный идентификатор последовательности, а в вашем случае имя будет CustomerName-Month-Year, т.е. со строкой в ​​этой таблице для каждой комбинации Клиент / Год / Месяц.

Затем напишите хранимую процедуру, аналогичную следующей, чтобы назначить новый порядковый номер:

CREATE PROCEDURE [dbo].[Counter_Next]
(
  @Name varchar(64)
  , @Value int out -- Value to be used
)
AS
BEGIN
  set nocount on;

  declare @Temp int;

  begin tran
    -- Ensure we have an exclusive lock before changing variables
    select top 1 1 from dbo.Counter with (tablockx);

    set @Value = null; -- if a value is passed in it stuffs us up, so null it

    -- Attempt an update and assignment in a single statement
    update dbo.[Counter] set
      @Value = Count1 = Count1 + 1
    where [Name] = @Name;

    if @@rowcount = 0 begin
      set @Value = 10001; -- Some starting value
      -- Create a new record if none exists
      insert into dbo.[Counter] ([Name], Count1)
        select @Name, @Value;
    end
  commit tran

  return 0;
END
0 голосов
/ 10 октября 2019

Можно использовать тип TIME вместо COUNT () для создания уникальных значений. Таким образом, вероятность появления дубликатов значительно ниже. Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...