Sql server 使用SP检索信息或在表中存在数据时生成信息
我有一个要求,我需要为表中的数据运行select语句,如果该数据存在,我需要返回一些列中的值。如果数据不存在,我需要插入新行并返回插入的数据 我将使用API执行存储过程并返回数据,然后通过OPC将其写入机器 我目前正在努力解决的问题是,创建了一个新条目,但没有将我需要增加的两列增加一位数。在下面的代码中,将创建一个新条目,但仍然返回并输入与前一批号相同的值。有没有更好的方法来实现我想做的事情Sql server 使用SP检索信息或在表中存在数据时生成信息,sql-server,stored-procedures,output,Sql Server,Stored Procedures,Output,我有一个要求,我需要为表中的数据运行select语句,如果该数据存在,我需要返回一些列中的值。如果数据不存在,我需要插入新行并返回插入的数据 我将使用API执行存储过程并返回数据,然后通过OPC将其写入机器 我目前正在努力解决的问题是,创建了一个新条目,但没有将我需要增加的两列增加一位数。在下面的代码中,将创建一个新条目,但仍然返回并输入与前一批号相同的值。有没有更好的方法来实现我想做的事情 CREATE PROCEDURE [dbo].[Lotconfirmation] @plcid
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),
问题还没解决,你们有没有找到更好/更有效的方法来实现我的期望
谢谢 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
看起来应该可以了,谢谢!有没有更有效的方法?