存储过程NVARCHAR输出值中的存储过程

时间:2018-09-25 07:15:47

标签: sql-server stored-procedures

我有一个存储过程,该存储过程返回这样写的nvarchar值:

ALTER PROCEDURE [dbo].[GetLastVouchNumber]
  @returnVal nvarchar(255) output

AS
BEGIN

SET @returnVal = ( SELECT CONCAT('I',VOUCHNO+1)
FROM TABVOU
WHERE VOUCHER = 'VOUCHER#')


END

我试图在另一个过程中使用此过程的输出值。这就是我尝试编写此新过程的方式:

ALTER PROCEDURE [dbo].[MassAdjInsertIntoYTDTRNI]
 @inputPeriod nvarchar(255),
 @inputUserId nvarchar(255)
AS
BEGIN
 DECLARE @resultOrdNo nvarchar (255)
 DECLARE @newOrdNo nvarchar(255)

 EXEC @newOrdNo = GetLastVouchNumber @resultOrdNo

 INSERT INTO  YTDTRNI(TRCDE,PROD,WH,DESCR,UCOST,TCOST,DRAC,CRAC,REM,QTY,UM,ORDNO,TRDATE,SYSDATE,PERIOD,USERID)
 SELECT 'AJ',PROD,WH,DESCR,0,-TCOST,STKGL,COSGL,'MASS ADJUSTMENT',0,UM,@newOrdNo, GETDATE(),GETDATE(),@inputPeriod,@inputUserId

FROM INV

我以为这行:

EXEC @newOrdNo = GetLastVouchNumber @resultOrdNo

会将第一个过程的结果存储到@newOrdNo中,然后再使用此@newOrdNo将其插入到另一个表中。但是在执行第二个存储过程之后,ORDNO列不包含任何值...

需要建议。

2 个答案:

答案 0 :(得分:1)

调用OUTPUT并使用GetLastVouchNumber作为输出参数时,请使用@newOrdNo关键字。您的GetLastVouchNumber过程返回带有输出参数的信息。

ALTER PROCEDURE [dbo].[MassAdjInsertIntoYTDTRNI]
    @inputPeriod nvarchar(255),
    @inputUserId nvarchar(255)
AS
BEGIN
    DECLARE @resultOrdNo nvarchar (255)
    DECLARE @newOrdNo nvarchar(255)

    -- Call your stored procedure
    EXEC GetLastVouchNumber @newOrdNo OUTPUT

    INSERT INTO YTDTRNI(TRCDE,PROD,WH,DESCR,UCOST,TCOST,DRAC,CRAC,REM,QTY,UM,ORDNO,TRDATE,SYSDATE,PERIOD,USERID)
    SELECT 'AJ',PROD,WH,DESCR,0,-TCOST,STKGL,COSGL,'MASS ADJUSTMENT',0,UM,@newOrdNo, GETDATE(),GETDATE(),@inputPeriod,@inputUserId

END

答案 1 :(得分:1)

您似乎混淆了返回值输出变量。您存储的proc使用后者来返回您的值,并且不显式返回任何内容(尽管令人困惑,因为您已将输出变量命名为returnVal)。

调用它时,必须指定OUTPUT

 EXEC GetLastVouchNumber @resultOrdNo OUTPUT