Вставка не рассчитанного идентификатора в таблицу транзакций SQL - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть хранимая процедура, где я получаю данные как JSON от API в C#. Я вставляю данные в две таблицы следующим образом:

INSERT INTO dbo.ServiceRequestHeader(SubscriptionId, CustomerAccountId, ModifiedBy)
OUTPUT Inserted.ServiceRequestHeaderId INTO @TempT
    SELECT
        SubscriptionId,
        CustomerAccountId,
        ModifiedBy
    FROM
        OpenJson(@JsonServiceRequest)
        WITH 
           (SubscriptionId TinyInt,
            CustomerAccountId Int)

SELECT @TempId = Id FROM @TempT   

INSERT INTO dbo.ServiceRequest(ServiceRequestId, ServiceRequestHeaderId, SubscriptionId)
    SELECT
        @TempId, -- <= Here I need to modify the serviceRequestHeaderId
        @TempId,
        SubscriptionId
    FROM
        OpenJson(@JsonServiceRequest, '$.ServiceRequest')
        WITH (SubscriptionId TinyInt,
             ...)

Дело в том, что serviceRequestId не является вычисляемым полем, а это особый случай, который зависит от ServiceRequestHeaderId.

Пример:

  • Если ServiceRequestHeaderId = 1000, то ServiceRequestId будет 1000 001, 1000 002 ... N ...

Это я не могу прийти с возможностью сделать это

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Вы можете создавать сервисные запросы, как указано ниже. Я использую функцию FORMAT с 000 для заполнения от 0 до 3 цифр. Если вы хотите четыре цифры, используйте 0000.

SELECT @TempId = Id FROM @TempT   

INSERT INTO dbo.ServiceRequest(ServiceRequestId, ServiceRequestHeaderId, SubscriptionId)
    SELECT
        CONCAT(@TempId,FORMAT(ROW_NUMBER() OVER(ORDER BY (SELECT null)),'000')) AS ServiceRequestId, -- <= Here I need to modify the serviceRequestHeaderId
        @TempId,
        SubscriptionId
    FROM
        OpenJson(@JsonServiceRequest, '$.ServiceRequest')
        WITH (SubscriptionId TinyInt,
             ...)

. Вы получите что-то вроде ниже:

+------------------+
| ServiceRequestId |
+------------------+
|          1000001 |
|          1000002 |
|          1000003 |
+------------------+
1 голос
/ 21 апреля 2020

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

with MyCTE as (
  select
    SubscriptionId
    -- Order by whatever makes business sense to you
    , row_number() over (order by SubscriptionId) rn
  from openjson(@JsonServiceRequest, '$.ServiceRequest')
  with (
    SubscriptionId tinyint,
    ...
  )
)
insert into dbo.ServiceRequest (ServiceRequestId, ServiceRequestHeaderId, SubscriptionId)
  -- Put whatever logic you like here to calculate a row number based id
  select convert(varchar(4),@TempId) + ' ' + case when rn >= 100 then convert(varchar(3),rn) when rn > 10 then '0' + convert(varchar(2),rn) else '00' + convert(varchar(1),rn) end
    , @TempId, SubscriptionId
  from MyCTE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...