簡體   English   中英

將變量從存儲過程傳遞給另一個

[英]Passing Variable from stored procedure to another

我有一個存儲過程,我需要將參數從一個過程傳遞到另一個過程,並將其顯示為 output。 我在我的程序 [xxx].[zzzz_ERP_Cyyyyy] 的 header 中聲明以下內容

 DECLARE @ProcedureLogRowKey INT
 DECLARE @ProcedureRecordCount INT 
 DECLARE @ProcedureStartDateTime DATETIME 
 DECLARE @ProcedureLog_Note NVARCHAR(100)

 EXEC [XXX].[spciProcedurePerformanceStartRecord_help]
      '.[xxx].[zzzz_ERP_Cyyyyy]',
      1,
      @ProcedureStartDateTime,
      'Contract Check',
      @ProcedureLogRowKey OUTPUT

我收到以下錯誤:

消息 515,級別 16,State 2,過程 spciProcedurePerformanceStartRecord_help,第 33 行 [批處理開始第 17 行]
無法將值 NULL 插入到列“YSTRTDTT_0”、表“000.xxx.YPERLOG”中; 列不允許空值。 插入失敗。

這是我從中獲取變量以傳遞到我的過程 [xxx].[zzzz_ERP_Cyyyyy] 的過程

 CREATE PROCEDURE [xxx].[spciProcedurePerformanceStartRecord_help]
     (@ProcedureName VARCHAR(200),
      @ProcedureRecordCount INT = 1,
      @ProcedureStartDateTime DATETIME = GETDATE,
      @ProcedureLog_Note NVARCHAR(100),
      @ProcedureLogRowKey INT OUTPUT  --- I am passing this into my proc and 
displaying it as output
     )
AS
BEGIN 
    -- Set Default return for @ProcedureLogRowKey, used if logging is not turned on. 
    SET @ProcedureLogRowKey = -1; 

    -- Check to see if performance logging is enabled 
    IF EXISTS(SELECT ROWID FROM LIVE.YPERCON 
              WHERE YPROCNM_0 = @ProcedureName AND YLOGENA_0 = 2) 
    BEGIN
        INSERT INTO xxx.YPERLOG (YROWKEY_0, YPROCNM_0, YRECCNT_0, YSTRTDTT_0, YENDDTT_0, YLOGNOTE_0, 
                                 YDURMS_0, CREDATTIM_0, UPDDATTIM_0, AUUID_0, CREUSR_0, UPDUSR_0)   
            SELECT 
                ISNULL(MAX(YROWKEY_0), 0) + 1, 
                @ProcedureName, @ProcedureRecordCount, @ProcedureStartDateTime, 
                '1753-01-01', 
                @ProcedureLog_Note, 0, 
                GETDATE(), GETDATE(), NEWID(), 'admin', 'admin'  
            FROM
                xxx.YPERLOG

        SELECT @ProcedureLogRowKey = ISNULL(MAX(YROWKEY_0), 0) 
        FROM xxx.YPERLOG
    END 
    ELSE
    BEGIN
        DECLARE @Count integer

        SELECT @Count = COUNT(0) 
        FROM LIVE.YPERERR 
        WHERE YPROCNM_0 = @ProcedureName 

        IS ISNULL(@Count, 0) = 0
            INSERT INTO LIVE.YPERERR (YPROCNM_0, YREQDT_0, YLASTDT_0, YERRMSG_0, 
                                      CREDATTIM_0, UPDDATTIM_0, AUUID_0, CREUSR_0, UPDUSR_0)
            VALUES (@ProcedureName, GETDATE(), '1753-01-01', 'Controller not defined or active', 
                    GETDATE(), GETDATE(), NEWID(), 'admin', 'admin')
        ELSE 
            UPDATE xxx.YPERERR
            SET YLASTDT_0 = GETDATE()
            WHERE YPROCNM_0 = @ProcedureName
       END
END 

提前致謝。

問題出在帶有參數@ProcedureStartDateTime DATETIME的過程[xxx].[spciProcedurePerformanceStartRecord_help]中。 您應該以這種方式設置其默認值:

在聲明中將默認值設置為NULL

@ProcedureStartDateTime DATETIME = NULL

它看起來像

CREATE PROCEDURE [xxx].[spciProcedurePerformanceStartRecord_help]
(
@ProcedureName VARCHAR(200)
,@ProcedureRecordCount INT = 1
,@ProcedureStartDateTime DATETIME = NULL
,@ProcedureLog_Note NVARCHAR(100)
,@ProcedureLogRowKey INT OUTPUT
)
AS
BEGIN

    -- procedure's body

END

在程序內部,在開始時,檢查@ProcedureStartDateTime參數的值是否為NULL ,如果是,則將其值設置為GETDATE()

SET @ProcedureStartDateTime = ISNULL(@ProcedureStartDateTime, GETDATE())

您已聲明DECLARE @ProcedureStartDateTime DATETIME並且沒有為其設置任何值。 因此,它具有 NULL 值,並且您將 NULL 值傳遞給程序執行

EXEC [XXX].[spciProcedurePerformanceStartRecord_help]
 '.[xxx].[zzzz_ERP_Cyyyyy]',
  1,
  @ProcedureStartDateTime, -- NULL value passed here
 'Contract Check',
 @ProcedureLogRowKey OUTPUT

由於目標列'YSTRTDTT_0', table '000.xxx.YPERLOG'不允許 NULL,因此您會收到錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM