Search code examples
sql-serverssisssis-2012

SSIS 2012: Metadata out of sync after add/remove script parameter


We have deployed several changes to SSIS packages successfully, but this particular change gives us an error of

The component metedata is out of sync with the compiled script. Recompile the script using the Script Component Editor.

It runs fine in the debugger on my jump host. What do I do to "recompile the script"? Or is there a deeper problem?

UPDATE 1: This particular script component is more like a destination, and asynchronous. It accepts input rows, and all (or most) of them are consumed within the script (it updates external data via a Web Service), and only the error cases continue through to the output.

I have narrowed down the problem to the absolute minimum change that gives this error: adding another input column (or remove an unused input column). To be precise, after opening the package in Visual Studio 2012 on my jump host, double-click the Perform ETL task to open the Data Flow, then double-click the G9 Web Service Script Component.

Screenshot of Script Component properties

I switch to Input Columns - there are 16 ticked/listed - and I untick one that is actually not used in the script. Or I tick (add) another column (which I want to use in the script).

Then I swap back to Script, click on Edit Script, and wait for the VstaProjects window to come up.

I either close this VstaProjects window straight away, or I make an extremely minor change to the script (comment only), then Build > Build ScriptComponent_5aa...acb, then press the floppy (Save) symbol, then exit Vsta.

Then I run in the debugger (press green start arrow) and it runs as expected. I build by right-clicking the project (G9) and selecting Build (this might be redundant after running in debugger).

In Windows (File) Explorer, I navigate to the G9/bin/Development folder, double-click G9.ispac (steps through deploy: Project Development file; my-dev-svr; SSISDB > ACME-SSIS (which gives SSISDB/ACME-SSIS/G9); Deploy!

Problem: When I log into my-dev-svr, drill into Integration Services Catalogs, and run the package, then drill into the Overview Report (for this execution) > View Messages, I see several errors. The most important are

  1. Perform ETL:Error: "G9 Web Service Script Component" failed validation and returned validation status "VS_ISBROKEN".
  2. Perform ETL:Error: The component metedata is out of sync with the compiled script. Recompile the script using the Script Component Editor.

Command Line

I'm not entirely convinced this is related, but here it is: I've copied G9.ispac to my-dev-svr, then logged in there and on the command-line, executed dtexec. Bear in mind that this is the same server where SSIS debugging does not work.

D:\ACME\Deploy\SSIS>dtexec /Project G9.ispac /Package ACMEPortal_ProjectProperties_G9.dtsx
Microsoft (R) SQL Server Execute Package Utility
Version 11.0.6020.0 for 64-bit
Copyright (C) Microsoft Corporation. All rights reserved.
Started:  10:51:21 PM
Warning: 2017-04-17 22:51:21.74
   Code: 0xC0016016
   Source:  SSIS:Property
   Description: Failed to decrypt an encrypted XML node. Verify that the project was created by the same user. Project load will attempt to continue without the encrypted information.
End Warning
Warning: 2017-04-17 22:51:21.74
   Code: 0x800190FF
   Source:
   Description: Failed to decrypt sensitive data in project with a user key. You may not be the user who encrypted this project, or you are not using the same machine that was used to save the project. If the sensitive data is a parameter value, the value may be required to run the package on the Integration Services server.
End Warning
Progress: 2017-04-17 22:51:25.61
   Source: Get ETL Configuration
   Executing query "etl_GetGenericETLConfigForACME".: 100% complete
End Progress
Progress: 2017-04-17 22:51:25.64
   Source: Get G9 Web Service Connection Config Details
   Executing query "etl_GetG9WSConfigSettings".: 100% complete
End Progress
Progress: 2017-04-17 22:51:25.65
   Source: Audit ETL Initiation
   Executing query "dbo.etl_AuditInitiation".: 100% complete
End Progress
Warning: 2017-04-17 22:51:25.68
   Code: 0x80019002
   Source: OnError
   Description: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED.  The Execution method succeeded, but the number of errors raised (6) reached the maximum allowed (1); resulting in failure. This occurs when the number of errors reaches the number specified in MaximumErrorCount. Change the MaximumErrorCount or fix the errors.
End Warning
Error: 2017-04-17 22:51:25.68
   Code: 0xC0010026
   Source: Set Propogate Error to False
   Description: The task has failed to load. The contact information for this task is "".
End Error
Error: 2017-04-17 22:51:25.71
   Code: 0xC0024107
   Source: Set Propogate Error to False
   Description: There were errors during task validation.
End Error
Error: 2017-04-17 22:51:25.71
   Code: 0xC0010026
   Source: Set FilenamePart and Error Variables
   Description: The task has failed to load. The contact information for this task is "".
End Error
Warning: 2017-04-17 22:51:25.72
   Code: 0x80019002
   Source: OnError
   Description: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED.  The Execution method succeeded, but the number of errors raised (10) reached the maximum allowed (1); resulting in failure. This occurs when the number of errors reaches the number specified in MaximumErrorCount. Change the MaximumErrorCount or fix the errors.
End Warning
Error: 2017-04-17 22:51:25.72
   Code: 0xC0010026
   Source: Set Propogate Error to False
   Description: The task has failed to load. The contact information for this task is "".
End Error
Error: 2017-04-17 22:51:25.73
   Code: 0xC0024107
   Source: Set Propogate Error to False
   Description: There were errors during task validation.
End Error
Error: 2017-04-17 22:51:25.73
   Code: 0xC0024107
   Source: Set FilenamePart and Error Variables
   Description: There were errors during task validation.
End Error
Warning: 2017-04-17 22:51:25.74
   Code: 0x80019002
   Source: ACMEPortal_ProjectProperties_G9
   Description: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED.  The Execution method succeeded, but the number of errors raised (8) reached the maximum allowed (1); resulting in failure. This occurs when the number of errors reaches the number specified in MaximumErrorCount. Change the MaximumErrorCount or fix the errors.
End Warning
DTExec: The package execution returned DTSER_FAILURE (1).
Started:  10:51:21 PM
Finished: 10:51:25 PM
Elapsed:  4.344 seconds

UPDATE 2: An excerpt from the Script Component.

' Microsoft SQL Server Integration Services user script component
' This is your new script component in Microsoft Visual Basic .NET
' ScriptMain is the entrypoint class for script components

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports ScriptComponentTaskUtility.ACME_ETLDataFlowScriptComponentTasks '-- custom toolkit
Imports ScriptComponentTaskUtility
Imports Microsoft.SqlServer.Dts
Imports System.Windows.Forms

<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute> _
<CLSCompliant(False)> _
Public Class ScriptMain
    Inherits UserComponent

    Private _updateLimit As Integer

    Private _rowCount As Integer

    Public Overrides Sub PreExecute()
        MyBase.PreExecute()
        '  
        ' Our application code follows 
        _updateLimit = 2   '-- Intending to replace this hard-coding
        _rowCount = 0
    End Sub

    Public Overrides Sub G9ProjectInput_ProcessInputRow(ByVal Row As G9ProjectInputBuffer)

        Try
            ' We limit the updated records to X per run (X = 2, but want to make configurable).
            ' Next ETL run will pick up next X
            _rowCount += 1
            If (_updateLimit > 0 And _rowCount > _updateLimit) Then Exit Sub

            Dim taskComponent As G9Project = New G9Project(Me.UserID, Me.Password, Me.Config, Me.WSURL)
            Dim readResponse As Project_DoReadResponse
            ''MessageBox.Show(Me.WSURL)
            readResponse = taskComponent.ReadProject(Row.g9ProjectNumber, Row.Planet)


            If (readResponse.Errors.Items.Length > 0) Then
                CreateErrorRows(Row, readResponse.Errors.Items(0).ShortDescription)
                Exit Sub
            End If
            Dim g9Project As Project = readResponse.Project

            '**********************************
            'Change the property values here
            Try


                ' Who's in charge? The Manager or Owner?
                If Not (Row.acmeInChargeCode_IsNull) Then
                    g9Project.SelectionCodes(10).Value = Row.acmeInChargeCode.ToString
                End If

                ' ... other fields

            Catch ex As Exception
                Row.ErrorColumnName = "Web Service Error"
                CreateErrorRows(Row, ex.Message)
                Exit Sub
            End Try

            'End of change of property values
            '**********************************

            Dim updateResponse As ResponseBase
            updateResponse = taskComponent.UpdateProject(g9Project)
            If (updateResponse.Errors.Items.Length > 0) Then
                CreateErrorRows(Row, updateResponse.Errors.Items(0).ShortDescription)
                Exit Sub
            End If
        Catch ex As Exception
            CreateErrorRows(Row, ex.Message)
            Exit Sub
        End Try
    End Sub

' #Region ************************ NOTE: Copy & paste following code block *********************
' contains private member variables, etc, including CreateErrorRows()

End Class

Solution

  • Since you have already work out the script and make sure the script works fine. Then it has a lot chance it has issues in your destination. It seems that you are using the Script component as data source, try to check the Metadata from the output of the source (right click the precedence constraint), check them whether they are matched with the input of destination, more important, if you have made any changes to the source columns, you'd better to delete and create a new destination, sometimes it might cache the columns that no longer exists.