У меня есть требование, при котором мне нужно выполнить оператор выбора для данных в таблице, если эти данные существуют, мне нужно вернуть значения в нескольких столбцах. Если данных не существует, мне нужно вставить новую строку и вернуть вставленные данные.
Я буду использовать 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),
Пока вопрос еще не решен, ребята, вы видите лучший / более эффективный способ сделать то, на что я надеюсь?
Спасибо!