Использование SP для получения информации или ее генерации, если данные существуют в таблице - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть требование, при котором мне нужно выполнить оператор выбора для данных в таблице, если эти данные существуют, мне нужно вернуть значения в нескольких столбцах. Если данных не существует, мне нужно вставить новую строку и вернуть вставленные данные.

Я буду использовать API для выполнения хранимой процедуры и возврата данных, а затем запишу это в машина через OP C.

В настоящее время я борюсь с тем, что создается новая запись, но она не увеличивает два столбца, которые мне нужно увеличить, на ди git. В приведенном ниже коде будет создана новая запись, но она по-прежнему будет возвращать и вводить то же значение, что и предыдущий номер лота. Есть ли лучший способ добиться того, что я хочу сделать?

CREATE PROCEDURE [dbo].[Lotconfirmation]
    @plcid nvarchar(6) OUTPUT,
    @supplierlot nvarchar(25),
    @internallotnum nvarchar(25)OUTPUT,
    @plclotnum nvarchar(25) OUTPUT,
    @suppliercode nvarchar(1),
    @supplierpartnum nvarchar(25),
    @suppliermodel nvarchar(25),
    @qtyconsumed int,   
    @id int OUTPUT,
    @errormsg nvarchar(max) OUTPUT,     
    @errornum int OUTPUT,   
    @errorproc nvarchar(max) OUTPUT,    
    @errorstate int OUTPUT,     
    @errorline int OUTPUT
AS
BEGIN
    BEGIN TRY
        /* Check if lot already exists */
        SELECT 
            @internallotnum = InternalLotNum, @plcid = PLCID, 
            @plclotnum = plclotnum, @id = id 
        FROM 
            dbo.ShrinkLotData 
        WHERE 
            SupplierMfgLot = @supplierlot

        IF @internallotnum IS NULL
        BEGIN
            DECLARE @table TABLE 
                           (
                                plcid nvarchar(6), 
                                internallotnum nvarchar(25), 
                                plclotnum nvarchar(25), 
                                id int
                           )

            INSERT INTO dbo.ShrinkLotData(PLCID, SupplierMfgLot, InternalLotNum, PLCLotNum, SupplierCode, SupplierPartNum, SupplierModel, QtyConsumed, Month, Day, Year, TimeStamp)
            OUTPUT inserted.plcid, inserted.InternalLotNum, inserted.PLCLotNum, inserted.ID
            VALUES (@plcid, @supplierlot,
                    (SELECT (MAX(InternalLotNum) + 1) FROM dbo.ShrinkLotData),
                    (SELECT MAX(RIGHT(InternalLotNum, 2) + 1) FROM dbo.ShrinkLotData),
                    @suppliercode, @supplierpartnum, @suppliermodel,
                    @qtyconsumed, 
                    MONTH(GETDATE()), DAY(GETDATE()), YEAR(GETDATE()),
                    CURRENT_TIMESTAMP)  

            SELECT @plcid = plcid, @internallotnum = internallotnum, @plclotnum = plclotnum, @id = id 
            FROM @table
        END
    END TRY
    /*   E-mail if errors occurs   */
    BEGIN CATCH         
        SET @errormsg = 'SP Failed with msg:' + ERROR_MESSAGE()         
        SET @errornum = ERROR_NUMBER()      
        SET @errorproc = ERROR_PROCEDURE()      
        SET @errorstate = ERROR_STATE()         
        SET @errorline = ERROR_LINE()   

        /* Place holder to insert fail data into a table            
        INSERT INTO KSError (datestamp, errormsg, errorproc, errorstate, errorline)             
        VALUES (@datestamp, @errormsg, @errornum, @errorproc, @errorstate, @errorline)     
        */

        EXECUTE msdb.dbo.sp_send_dbmail         
                     @recipients = 'email@domain.com',      
                     @profile_name = 'Profile Alert',       
                     @subject = 'KepServer Stored Procedure:',      
                     @body = @errormsg

    END CATCH
END 
GO

РЕДАКТИРОВАТЬ:

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

(SELECT MAX(CAST(InternalLotNum AS INT)) + 1 FROM dbo.ShrinkLotData),
(SELECT MAX(RIGHT(CAST(InternalLotNum AS Int), 2) + 1) FROM dbo.ShrinkLotData),

Пока вопрос еще не решен, ребята, вы видите лучший / более эффективный способ сделать то, на что я надеюсь?

Спасибо!

1 Ответ

1 голос
/ 16 февраля 2020

Предложение OUTPUT возвращает значения непосредственно клиенту, а не вставляет их в переменную таблицы. Должно быть что-то вроде:

    INSERT INTO dbo.ShrinkLotData(PLCID, SupplierMfgLot, InternalLotNum, PLCLotNum, SupplierCode, SupplierPartNum, SupplierModel, QtyConsumed, Month, Day, Year, TimeStamp)
    OUTPUT inserted.plcid, inserted.InternalLotNum, inserted.PLCLotNum, inserted.ID
    INTO @table(plcid,InternalLotNum,PLCLotNum,ID)
    VALUES (@plcid, @supplierlot,
            (SELECT (MAX(InternalLotNum) + 1) FROM dbo.ShrinkLotData),
            (SELECT MAX(RIGHT(InternalLotNum, 2) + 1) FROM dbo.ShrinkLotData),
            @suppliercode, @supplierpartnum, @suppliermodel,
            @qtyconsumed, 
            MONTH(GETDATE()), DAY(GETDATE()), YEAR(GETDATE()),
            CURRENT_TIMESTAMP)  

    SELECT @plcid = plcid, @internallotnum = internallotnum, @plclotnum = plclotnum, @id = id 
    FROM @table
...