The postings on this site are my own and do not represent my Employer's positions, advice or strategies.

LifeAsBob - Blog

 

Home

No Ads ever, except search!
Thursday, April 25, 2024 Login
Public

SSIS Stored Procedure Metadata 8/15/2008 12:56:35 PM

Working with SSIS, a stored procedure was recently changed from a simple select statement to include some more procedural statements that utilized temporary tables.  Surprisingly the SSIS package stopped working, even though the result set from the stored procedure remained the same.  One of the reasons to use the stored procedure in ssis, was to avoid embedding the login in the SSIS packages related to data access, what gives ?

Error is:


The component is not in a valid state. The validation errors are:
Warning at {6D024AC3-A299-4316-B8D6-BF5A7006768A} [OLE DB Source [1]]: The external metadata column collection is out of synchronization with the data source columns. The "external metadata column "employee_office" (36)" needs to be removed from the external metadata column collection.

Do you want the component to fix these errors automatically?



Some Quick research indicates this error is exactly what it says, metadata.  SSIS needs to know the metadata, for stored procedures, using an ole db data source, it does this by querying the first statement in the stored procedure, if the first statements are temporary tables and not a select statement , you've got the problem.   I've seen instances where temporary variables are ok and don't cause the problem.

I've seen several solutions to this problem using "set fmtonly off" in the SSIS call and "set nocount on" in the stored procedure.  While "set nocount on" is usually recommended, i'm not too pleased with the "set fmtonly off" solution, as I've read issues where this may or may not work and cause performance issues.

There seem to be several different ways to fix this, each of them slightly different, my preference is option 3. 

1.  Put "set nocount on" in the stored procedure, put "set fmtonly off" before the execution of the procedure [in the ssis call]. 

2.  re-write the stored procedure to use table variables instead of temporary tables, a good solution as well.

3.  Add some meta-data and the "set nocount on" to the stored procedure with a "short circuited if clause" (if 1=0), and a bogus select statement at the top.  I've tested with trying to leave the "set nocount on" out and it did not work.

CREATE PROCEDURE [dbo].[GenMetadata]

AS

    SET NOCOUNT ON

 

    IF 1 = 0

        BEGIN

            -- Publish metadata

            SELECT  CAST(NULL AS INT) AS id,

                    CAST(NULL AS NCHAR(10)) AS [Name],

                    CAST(NULL AS NCHAR(10)) AS SirName

        END

 

    -- Do real work starting here

    CREATE TABLE #test

        (

          [id] [int] NULL,

          [Name] [nchar](10) NULL,

          [SirName] [nchar](10) NULL

        )

 


References:

http://www.delphi.co.za/PermaLink,guid,56a56e23-d9d5-44dd-9f0b-0f8b80d0b462.aspx

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=572199&SiteID=1

http://scotta-businessintelligence.blogspot.com/2007/05/ssis-ole-db-source-component-stored.html

http://blogs.conchango.com/jamiethomson/archive/2006/12/20/SSIS_3A00_-Using-stored-procedures-inside-an-OLE-DB-Source-component.aspx

 


Blog Home