Обработка ошибок в SSIS

Я создал пакет SSIS, который получает XML-файл из папки и сверяется со схемой. Если схема дает сбой, пакет регистрирует ошибку и перемещает файл в папку с ошибками. В настоящее время я выполнил все требования и работает нормально, за исключением сообщения об ошибке, которое я получаю в конце выполнения.

  1. Проверить XML-файл

введите здесь описание изображения

  1. Сообщение об ошибке, которое я получаю

введите здесь описание изображения

  1. Сообщение об ошибке, которое я получаю

введите здесь описание изображения

Пакет работает нормально, как и ожидалось. Как я могу подавить это сообщение об ошибке?

Обновление №1:

Это моя история ошибок

введите здесь описание изображения

Это мои свойства задачи проверки XML-схемы.

введите здесь описание изображения


person Ranjith Varatharajan    schedule 11.01.2018    source источник
comment
Какое сообщение об ошибке вы получаете при выполнении пакета? т.е. какое сообщение об ошибке вы увидите, если проверите журнал выполнения в Visual Studio?   -  person Ferdipux    schedule 11.01.2018
comment
Способ подавления ошибки может зависеть от ее серьезности. Вы показали нам снимки экрана с ошибкой, происходящей в Visual Studio. После запуска и возникновения ошибки, прежде чем нажать «Остановить отладку», перейдите на вкладку «Ход выполнения» и прокрутите вниз, чтобы найти сообщение об ошибке, которое вы получаете. (Примечание: вы можете установить для задачи «сбой пакета при сбое» значение «false» в ее свойствах, но могут быть и другие решения, поэтому пока они не указаны в качестве ответа).   -  person Rich    schedule 11.01.2018
comment
Спасибо за ответ, я обновил вопрос.   -  person Ranjith Varatharajan    schedule 12.01.2018


Ответы (1)


Предложения

Проблема может быть вызвана свойствами FailPackageOnFailure и FailParentOnFailure. Нажмите на задачу Validate XML и на вкладке «Свойства» измените значения этих свойств. Алос в Control Flow Перейдите в свойства и измените значение MaximumErrorCount и сделайте его больше, чем 1.

введите здесь описание изображения

Также вы можете найти другую полезную информацию по этой ссылке:

Обходной путь с помощью задачи сценария

  1. Добавьте 3 переменные в свой пакет:

    @[User::XmlPath] Type: String, Description: Store the Xml File Path
    @[User:XsdPath] Type: String, Description: Store the Xsd File Path
    @[User:IsValidated] Type: Boolean, Description: Store the result of Xml validation
    
  2. Добавьте задачу сценария, выберите XmlPath и User:XsdPath в качестве переменных только для чтения и IsValidated в качестве переменной для чтения и записи.

  3. Установите язык скрипта на Visual Basic
  4. В редакторе скриптов напишите следующий код (это весь код задачи скрипта)

    #Region "Imports"
    Imports System
    Imports System.Collections.Generic
    Imports System.Data
    Imports System.Math
    Imports System.Text
    Imports System.Xml
    Imports System.Xml.Schema
    Imports Microsoft.SqlServer.Dts.Runtime
    #End Region
    
    <Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute()>
    <System.CLSCompliantAttribute(False)>
    Partial Public Class ScriptMain
        Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    
        Enum ScriptResults
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        End Enum
    
        Public Function LoadXml(xmlFilePath As String, xsdFilePath As String) As Boolean
            Dim settings As New XmlReaderSettings()
            settings.Schemas.Add(Nothing, xsdFilePath)
            settings.ValidationType = ValidationType.Schema
            Dim errorBuilder As New XmlValidationErrorBuilder()
            AddHandler settings.ValidationEventHandler, New ValidationEventHandler(AddressOf errorBuilder.ValidationEventHandler)
            Dim reader As XmlReader = XmlReader.Create(xmlFilePath, settings)
            ' Read the document...
            Dim errorsText As String = errorBuilder.GetErrors()
            If errorsText IsNot Nothing Then
                Return False
            Else
                Return True
            End If
        End Function
    
        Public Sub Main()
    
            Dts.Variables("IsValidated").Value = LoadXml(Dts.Variables("XmlPath").Value.ToString, Dts.Variables("XsdPath").Value.ToString)
    
            Dts.TaskResult = ScriptResults.Success
        End Sub
    
    
    End Class
    
    Public Class XmlValidationErrorBuilder
        Private _errors As New List(Of ValidationEventArgs)()
    
        Public Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)
            If args.Severity = XmlSeverityType.Error Then
                _errors.Add(args)
            End If
        End Sub
    
        Public Function GetErrors() As String
            If _errors.Count <> 0 Then
                Dim builder As New StringBuilder()
                builder.Append("The following ")
                builder.Append(_errors.Count.ToString())
                builder.AppendLine(" error(s) were found while validating the XML document against the XSD:")
                For Each i As ValidationEventArgs In _errors
                    builder.Append("* ")
                    builder.AppendLine(i.Message)
                Next
                Return builder.ToString()
            Else
                Return Nothing
            End If
        End Function
    End Class
    
  5. Используйте ограничения приоритета с выражением, чтобы манипулировать как успешными, так и неудачными проверками.

введите здесь описание изображения

введите здесь описание изображения

Справочник по коду скрипта

person Hadi    schedule 11.01.2018
comment
Я все это сделал, все работает нормально, пакет не падает и имеет тенденцию работать постоянно. Единственное, я получаю это сообщение об ошибке. Поскольку я обработал ошибку схемы xml, как показано на первом изображении, мне не нужно сообщение об ошибке (изображение 3) после выполнения пакета. Это то что мне нужно - person Ranjith Varatharajan; 12.01.2018
comment
Вы не можете удалить его, в этом случае вы можете использовать ForceExecutionResult, но я не помогу в этом случае. - person Hadi; 12.01.2018
comment
Вы можете использовать задачу сценария для проверки Xml и присвоить результат переменной, а затем использовать выражения приоритета для достижения аналогичного случая. - person Hadi; 12.01.2018
comment
@RanjithVaradan Также имейте в виду, что если вы перестанете показывать сообщения об ошибках из задач, другие ошибки будут игнорироваться, что очень важно. - person Hadi; 12.01.2018
comment
Можно ли сохранить результат проверки схемы xml в логической переменной, а затем принудительно выполнить эту задачу, а затем обработать файл ошибки, используя логическую переменную в выражении? - person Ranjith Varatharajan; 12.01.2018
comment
Я думаю, вам нужна задача сценария - person Hadi; 12.01.2018
comment
@RanjithVaradan проверьте обновление моего ответа, обратите внимание, что код, который я использовал, скопирован из ссылки, упомянутой в ссылках, я действительно не смог его проверить, пожалуйста, дайте мне ответ при тестировании. - person Hadi; 13.01.2018