SCOPE_IDENTITY иногда возвращает нулевые значения - PullRequest
0 голосов
/ 04 октября 2019

У меня есть SQL-запрос, в котором иногда значение IDENTITY из INSERT [Form] в первом операторе возвращается как NULL и вызывает сбой остальных операторов в пакете.

Я включил второй блок процедуры, чтобы указать, где происходит сбой из-за конфликта с ограничением FK для таблицы Form

Ранее он использовал SCOPE_IDENTITY, но я изменил его, чтобы использовать временные таблицы SQL Server и предложение OUTPUT, чтобы посмотреть, облегчит ли это проблему, и не имеет.

Эта процедура вызывается из приложения веб-форм ASP.NETи вызов инициируется вызовом веб-API, выполняющимся в этом приложении.

Раньше, до того, как это было сделано в вызове Web API, оно было инициировано событием click в приложении webforms. В то время я видел, как эта ошибка возникает время от времени.

При более активном использовании приложения и более тяжелых нагрузках такое случается чаще.

Я проверял, и неттриггеры на столе, которые стреляют. Я не могу придумать способ воспроизвести или отследить проблему.

В большинстве случаев процедура работает нормально, но время от времени это не так, и я не уверен почему. Иногда я вижу журнал ошибок, возникающих несколько раз подряд, когда пользователь пытается сохранить то, над чем он работает. Если они пробуют достаточное количество раз, это похоже на работу.

Я рассмотрел использование других форм поиска идентичности, таких как @@IDENTITY, и они не будут работать для того, что мне нужно.

Естьтам что-то мне не хватает?

ALTER PROCEDURE [dbo].[IC_Note_UpdateForm]
    @FormID int = -1 OUTPUT, @ConsultFormID int = -1 OUTPUT, @PatientSignature bit, @DSPSignature bit, @Editable bit, @Narrative nvarchar(MAX) = NULL, @SignificantIssues nvarchar(MAX), @UserID int, @DSPID int, @FormTypeID int, @ServiceID int, @ApptID int OUTPUT, @LocationID int, @LoggedInUser int, @PortalId int,@ClientNotes nvarchar(MAX)
WITH EXEC AS CALLER
AS
SET NOCOUNT ON;

--This is needed for whatever reason in order to get the correct date submitted. Using the function call inline causes weird stuff to happen 
DECLARE @DateSubmitted DATETIME = dbo.GetLocalTime(default)

DECLARE @count int
--See if a record exists for the Form
SELECT @count = COUNT(FormId) FROM Form WHERE (formID = @FormID OR (apptID = @ApptID AND apptID >= 1))

if @count > 0 BEGIN

    UPDATE dbo.Form SET 
        FormTypeID = @FormTypeID,
        patientSignature = @PatientSignature,
        dspSignature = @DSPSignature,
        editable = @Editable,
        dateSubmitted = @DateSubmitted
    WHERE 
        formID = @FormID

    IF @Editable = 0 BEGIN
        exec IC_NoteAudit_Insert @FormId, @DSPID, 'SUBMITTED'
    END ELSE BEGIN 
        exec IC_NoteAudit_Insert @FormID, @DSPID, 'UPDATED'
    END

END ELSE BEGIN
    DECLARE @tempForm TABLE (FormId int) 

    INSERT dbo.Form (
        PortalId
        ,userID
        ,dspID
        ,dateSubmitted
        ,patientSignature
        ,dspSignature
        ,editable
        ,approved
        ,dateApproved
        ,rejected
        ,formTypeID
        ,paid
        ,billed
        ,serviceID
        ,apptID
    ) OUTPUT inserted.formId INTO @tempForm
        VALUES (
            @PortalId
        ,@UserID   -- userID - int
        ,@DSPID   -- dspID - int
        ,@DateSubmitted  -- dateSubmitted - datetime
        ,@PatientSignature  -- patientSignature - bit
        ,@DSPSignature  -- dspSignature - bit
        ,@Editable  -- editable - bit
        ,null  -- approved - bit
        ,null  -- dateApproved - datetime
        ,null  -- rejected - bit
        ,@FormTypeID   -- formTypeID - int
        ,0  -- paid - bit
        ,0  -- billed - bit
        ,@ServiceID   -- serviceID - int
        ,@ApptID   -- apptID - int
    )

    --This was SET @FormId = SCOPE_IDENTITY() before and had the same NULL FK constraint occur 
    SET @FormID = (SELECT TOP 1 FormId FROM @tempForm)

END

--Move these out of scope of the IDENTITY retrieval 
IF @count = 0 BEGIN 
    exec IC_NoteAudit_Insert @formID, @DSPID, 'CREATED'

    IF @Editable = 0 BEGIN
        exec IC_NoteAudit_Insert @formID, @DSPID, 'SUBMITTED'
    END
END

SELECT @count = COUNT(FormId) FROM ConsultForm WHERE formId = @FormID
IF @count > 0 BEGIN

--See if a row exists for the ConsultForm
UPDATE dbo.ConsultForm SET 
    narrative = @Narrative,
    significantIssues = @SignificantIssues
WHERE 
    consultFormID = @ConsultFormID
    AND formID = @FormID

END ELSE BEGIN
    DECLARE @tempConsultForm TABLE (ConsultFormId int)
    INSERT dbo.ConsultForm (
        PortalId
        ,formID
        ,dateOfService
        ,timeIn
        ,timeOut
        ,narrative
        ,significantIssues
        ,locationOfService
    ) OUTPUT inserted.ConsultFormID INTO @tempConsultForm
    VALUES (
        @PortalId,
        @FormID    -- formID - int
        ,null  -- dateOfService - datetime
        ,null  -- timeIn - datetime
        ,null  -- timeOut - datetime
        ,@Narrative -- narrative - nvarchar(MAX)
        ,@SignificantIssues -- significantIssues - nvarchar(MAX)
        ,null -- locationOfService - nvarchar(MAX)
    )

    /*** Failure with FK constraint happens here, @FormId is NULL ***/

    SET @ConsultFormID = (SELECT TOP 1 ConsultFormId FROM @tempConsultForm)

END ````

1 Ответ

0 голосов
/ 04 октября 2019

Какая версия SQL выглядит как ошибка в SQL. Можете ли вы использовать RAISERROR внутри кода SQL, чтобы убедиться, что это проблема в самом SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...