Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用SP检索信息或在表中存在数据时生成信息_Sql Server_Stored Procedures_Output - Fatal编程技术网

Sql server 使用SP检索信息或在表中存在数据时生成信息

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

我有一个要求,我需要为表中的数据运行select语句,如果该数据存在,我需要返回一些列中的值。如果数据不存在,我需要插入新行并返回插入的数据

我将使用API执行存储过程并返回数据,然后通过OPC将其写入机器

我目前正在努力解决的问题是,创建了一个新条目,但没有将我需要增加的两列增加一位数。在下面的代码中,将创建一个新条目,但仍然返回并输入与前一批号相同的值。有没有更好的方法来实现我想做的事情

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

看起来应该可以了,谢谢!有没有更有效的方法?