Как можно пересчитать значение для вставки в столбец после каждой вставки во время нескольких вставок на SQL Server? - PullRequest
0 голосов
/ 09 марта 2020

Мне нужно взять сводку счетов и детали из двух таблиц в одной базе данных в две таблицы в другой базе данных. Я не могу манипулировать столбцами в любой таблице, так как они являются проприетарным программным обеспечением и требуют, чтобы таблицы работали должным образом. Часто на один счет накладывается более одной строки детализации.

В первой таблице строки отличаются itemid для каждой детали, которая является первичным ключом. Во второй таблице несколько подробных записей для одного счета-фактуры различаются столбцом с именем Sequence. Этот столбец имеет тип varchar(3), и значения должны быть от 001 до 999.

Для каждого счета-фактуры последовательность перезапускается с 001. В моей ситуации большинство счетов-фактур имеют от 1 до 50 записей сведений. Потенциал для нескольких больше, но не норма.

Пожалуйста, посмотрите образец требуемых результатов на этом изображении. Обратите внимание, что каждый номер счета-фактуры имеет упорядоченные детали 001, 002,003 и т. Д. c.

данные счета-фактуры во второй базе данных

Я упростил вставку здесь, включив только поля, имеющие отношение к проблеме. Я включил вкладыш для сводки счетов, а также детали. Тем не менее, моя единственная проблема связана с полем последовательности при вставке деталей счета. Все остальные столбцы переносятся нормально.

INSERT INTO [spectrum].[dbo].[CR_INVOICE_HEADER_MC] ([Company_Code],[Customer_Code], [Invoice_Or_Transaction], [Transaction_Type], [Job_Number],[Invoice_Date]
    SELECT 
        'WST' as Company_code, Customer,
        RIGHT(('          ' + a.InvoiceNumber), 10) AS Invoice_or_transaction,
        'I' as Invoice_Type,
        RIGHT(('          ' + a.Job), 10) AS job_number,
        InvoiceDate AS Invoice_Date
    FROM 
        [CommandCenter].[dbo].[Invoices] a
    LEFT OUTER JOIN
        [CommandCenter].[dbo].[Jobs] j ON j.job = a.Job
    WHERE 
        a.posted = '1' 
        AND a.invoicedate BETWEEN '20200101' AND '20200131';

INSERT INTO [spectrum].[dbo].[CR_INVOICE_DETAIL_MC] ([Company_Code], [Customer_Code], [Invoice_Or_Transaction], [Transaction_Type], [Sequence]
    SELECT 
        'WST' AS [Company_Code], A.CUSTOMER AS Customer_Code,
        A.InvoiceNumber AS Invoice_or_transaction, 'I' AS Transaction_type,
        CASE
           WHEN ISNULL((SELECT MAX ([Sequence]) 
                        FROM [Spectrum].dbo.CR_INVOICE_DETAIL_MC
                        WHERE Invoice_Or_Transaction = b.invoiceid), '0') = '0'              
              THEN '001'
              ELSE RIGHT('000' + (SELECT CAST(MAX(sequence) + 1 AS VARCHAR(3)) 
                                  FROM [Spectrum].dbo.CR_INVOICE_DETAIL_MC 
                                  WHERE Invoice_Or_Transaction = b.invoiceid), 3)
        END AS SEQUENCE
    FROM 
        [CommandCenter].[dbo].[Invoices] A
    LEFT OUTER JOIN 
        [CommandCenter].[dbo].[InvoiceItems] B ON A.InvoiceID = B.InvoiceID
    WHERE 
        a.posted = '1' 
        AND a.invoicedate BETWEEN '20200101' AND '20200131'

Это не меняет порядковый номер для каждой записи. Если во второй базе данных нет подробностей для счета-фактуры, будет установлена ​​последовательность '001' для всех записей, вставленных в одну команду вставки. Если записи уже существуют, он установит порядковый номер один выше и сделает его одинаковым для всех вставок. См. Примеры результатов ниже.

Добавлена ​​первая подробная запись для двух счетов

Добавлена ​​более подробная запись для тех же двух счетов

...