MS SQL - Обновление оператора отличается от результата в зависимости от версии SSMS - PullRequest
0 голосов
/ 23 января 2020

У меня есть таблица, которая запускает триггер при обновлении записи. Когда я обновляю запись, используя DML-оператор с использованием SSMS 18.4, транзакция откатывается из-за ошибки 'A trigger returned a resultset and the server option 'disallow results from triggers' is true.'

Когда я запускаю тот же оператор из SSMS 11.03, обновление сохраняется без выдачи сообщения об ошибке выше .

Ниже приведен код триггера:

    DECLARE     @iCntrMTL varchar(20),
            @iCntrLOD varchar(20), 
            @iCntrWeight int, 
            @iCntrID int,
            @iCntrEmpty bit,
            @iCntrDestination varchar(150), 
            @iCntrDestBOLLOD varchar(20),
            @iCntrEmptyWeight int,
            @iCntrToFill bit,
            @iCntrUseForLoading bit,
            @pCntrMTL varchar(20),
            @pCntrLOD varchar(20), 
            @pCntrWeight int, 
            @pCntrID int, 
            @pCntrEmpty bit,
            @pCntrDestination varchar(150), 
            @pCntrDestBOLLOD varchar(20),
            @pCntrEmptyWeight int,
            @pCntrToFill bit,
            @pCntrUseForLoading bit,
            @AuditText varchar(2500)

select * into #inserted from inserted 

if update(cntrweight) or update(cntrMTL) or update(cntrlod) or update(CntrDestination) or update(CntrDestBOLLOD) or update(cntrempty)
    or update(cntruseforloading) or update(cntrtofill) or update(cntremptyweight)
    BEGIN
        select  @iCntrid = cntrid, 
                @iCntrMTL = cntrmtl, 
                @icntrlod = cntrlod, 
                @iCntrWeight = CntrWeight, 
                @iCntrDestination = CntrDestination, 
                @iCntrDestBOLLOD = CntrDestBOLLOD,
                @iCntrEmpty = CntrEmpty,
                @iCntrUseForLoading = CntrUseForLoading,
                @iCntrToFill = CntrToFill,
                @iCntrEmptyWeight = CntrEmptyWeight
        from inserted
        select  @pCntrid = cntrid, 
                @pCntrMTL = cntrmtl, 
                @pcntrlod = cntrlod, 
                @pCntrWeight = CntrWeight, 
                @pCntrDestination = CntrDestination, 
                @pCntrDestBOLLOD = CntrDestBOLLOD,
                @pCntrEmpty = CntrEmpty,
                @pCntrUseForLoading = CntrUseForLoading,
                @pCntrToFill = CntrToFill,
                @pCntrEmptyWeight = CntrEmptyWeight
        from deleted

        --select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '#inserted'
        --select * from #inserted
        if @pCntrMTL != @iCntrMTL 
            set @AuditText = isnull(@AuditText,'') + 'Prev.CntrMTL=' + isnull(@pCntrMTL,'') + ' -- New.CntrMTL= ' + isnull(@iCntrMTL ,'') + ' || '
        --Set @AuditText = 'Prev.CntrMTL=' + isnull(@pCntrMTL,'') + ' -- New.CntrMTL= ' + isnull(@iCntrMTL ,'') + ' || '
        if @pCntrLOD != @iCntrLOD
            Set @AuditText = isnull(@AuditText,'') + 'Prev.CntrLOD=' + isnull(@pCntrLOD,'') + ' -- New.CntrLOD= ' + isnull(@iCntrLOD,'') + ' || '
        if @pCntrWeight != @iCntrWeight
            Set @AuditText = isnull(@AuditText,'') + 'Prev.CntrWeight=' + convert(varchar(10),isnull(@pCntrWeight,'')) + ' -- New.CntrWeight= ' + convert(varchar(10),isnull(@iCntrWeight,'')) + ' || ' 
        if @pCntrDestination != @iCntrDestination
            Set @AuditText = isnull(@AuditText,'') + 'Prev.CntrDestination=' + isnull(@pCntrDestination,'') + ' -- New.CntrDestination= ' + isnull(@iCntrDestination,'') + ' || '
        if @pCntrDestBOLLOD != @iCntrDestBOLLOD
            Set @AuditText = ISNULL(@AuditText,'') + 'Prev.CntrDestBOLLOD=' + isnull(@pCntrDestBOLLOD,'') + ' -- New.CntrDestBOLLOD= ' + isnull(@iCntrDestBOLLOD,'') + ' || '
        if @pCntrEmpty != @iCntrEmpty
            Set @AuditText = ISNULL(@AuditText,'') + 'Prev.CntrEmpty=' + cast(@pCntrEmpty as char(1)) + ' -- New.CntrEmpty= ' + cast(@iCntrEmpty as char(1)) + ' || '
        if @pCntrUseForLoading != @iCntrUseForLoading
            Set @AuditText = ISNULL(@AuditText,'') + 'Prev.CntrUseForLoading=' + cast(@pCntrUseForLoading as char(1)) + ' -- New.CntrUseForLoading= ' + cast(@iCntrUseForLoading as char(1)) + ' || '
        if @pCntrToFill != @iCntrToFill
            Set @AuditText = ISNULL(@AuditText,'') + 'Prev.CntrToFill=' + cast(@pCntrToFill as char(1)) + ' -- New.CntrToFill= ' + cast(@iCntrToFill as char(1)) + ' || '
        if @pCntrEmptyWeight != @iCntrEmptyWeight
            Set @AuditText = ISNULL(@AuditText,'') + 'Prev.CntrEmptyWeight=' + convert(varchar(10),isnull(@pCntrEmptyWeight,'')) + ' -- New.CntrEmptyWeight= ' + convert(varchar(10),isnull(@iCntrEmptyWeight,'')) + ' || '
        IF @AuditText is not null 
            INSERT INTO ContainerMutaties (CmCntrID,CmTimeStamp, CmMutatie, cmcmcName) values (@iCntrid, getdate(), @AuditText, 'CHG')
    END

END

Если отключить оператор select * into #inserted from inserted, который не нужен, он по-прежнему выдает ту же ошибку.

Может кто-нибудь объяснить, почему ошибка генерируется в SSMS 18.4, а не в SSMS 11.03, а также, какой оператор возвращается из триггера в соответствии с сообщением об ошибке? Я бы добавил select * into #inserted from inserted, но затем, удаляя его из триггера, он все равно выдает ту же ошибку, поэтому это должно быть что-то еще.

1 Ответ

1 голос
/ 23 января 2020

Я думаю, что нашел причину root. У меня была включена опция «Включить фактический план выполнения» в SSMS. После отключения этой опции оператор обновления работал без проблем в SSMS 18.4. При включении его в SSMS 11.03 он не работает по той же причине ..... Для меня это странно, но это может быть связано с тем, что мне не хватает некоторых знаний SQL знания

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