MSDN > 論壇首頁 > SQL Server Integration Services > how to call a stored procedure in SSIS
發問發問
 

已答覆how to call a stored procedure in SSIS

  • 2006年7月21日 下午 05:35qadirsyed 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     

    I have to transfer data from source to destination using stored procedures result  set.  There might be some more transformation needed to store the final result in the destination table.

    Appreciate an early feedback.

    Qadir Syed

     

解答

  • 2007年5月11日 上午 09:59jaegd 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     已答覆
    Use a no-op select statement to "declare" metadata to the pipeline.  Since stored procedures don't publish rowset meta-data like tables,views and table-valued functions, the first select statement of a stored procedure is used by the SQLClient OLEDB provider to determine column metadata.

    Code Snippet

    CREATE PROCEDURE dbo.GenMetadata
    AS
        SET NOCOUNT ON
       
       IF 1 = 0
       BEGIN
           SELECT CAST(1 as smallint) as Fake
           -- Publish metadata
        END
       
        -- do real work starting here
        DECLARE @x char(1)
        SET @x = (SELECT '1')
       
       
        SELECT cast(@x as smallint)
       
        RETURN







所有回覆

  • 2006年7月21日 下午 05:44Glenn Wellington 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     

    Just create a new instance of "OLE DB Command".

    Pick and choose your connection, and call the command as exec <procedure name>

  • 2007年5月11日 上午 08:04Mallikarjun n Channappagoudra 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
     "Oledb command" Source executes stored procedures.But it does not recognize the output  of the stored procedure.
    If I have a select statement at the end of the Stored procedure that returns me some columns,then those columns are not recognized by "OLEDB Command" as out put columns.



    Is there any advice for executing such stored procedure?
  • 2007年5月11日 上午 09:59jaegd 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     已答覆
    Use a no-op select statement to "declare" metadata to the pipeline.  Since stored procedures don't publish rowset meta-data like tables,views and table-valued functions, the first select statement of a stored procedure is used by the SQLClient OLEDB provider to determine column metadata.

    Code Snippet

    CREATE PROCEDURE dbo.GenMetadata
    AS
        SET NOCOUNT ON
       
       IF 1 = 0
       BEGIN
           SELECT CAST(1 as smallint) as Fake
           -- Publish metadata
        END
       
        -- do real work starting here
        DECLARE @x char(1)
        SET @x = (SELECT '1')
       
       
        SELECT cast(@x as smallint)
       
        RETURN







  • 2007年5月28日 下午 09:25LittleBull 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    jaegd - thanks!!!
  • 2007年6月28日 上午 08:34Mallikarjun n Channappagoudra 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    It does not work If there are more than one rows are coming out of stored procedure.



  • 2007年6月28日 上午 08:37Mallikarjun n Channappagoudra 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    I got  it solved on my end by replacing all temporary tables by temporary variables.
     
  • 2007年6月28日 上午 08:50jaegd 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     

    Please give an example of what doesn't work for you.

  • 2007年6月29日 上午 09:13Mallikarjun n Channappagoudra 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    In the above post it should be table variable not temporary variable.

    Conclusion:
    It was table variable that Used instead of temporary table.

  • 2007年6月29日 上午 09:51Mallikarjun n Channappagoudra 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    Hey try with the example below

    CREATE PROCEDURE dbo.GenMetadata
    AS
    SET NOCOUNT ON
    CREATE TABLE #test(
    [id] [int] NULL,
    [Name] [nchar](10) NULL,
    [SirName] [nchar](10) NULL
    ) ON [PRIMARY]


    INSERT INTO #test
    SELECT '1','A','Z' union all select '2','b','y'

    select id,name,SirName
    from #test
    drop table #test
    RETURN

    Please let me know the result.
  • 2007年6月29日 下午 02:59jaegd 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     

    With a local temp table created in the stored procedure, use a no-op select statement to "declare" metadata to the pipeline. 

     

     

    Code Snippet

    IF OBJECT_ID('[dbo].[GenMetadata]', 'P') IS NOT NULL

        DROP PROCEDURE [dbo].[GenMetadata]

    GO

    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

            )

     

     

        INSERT  INTO #test

                SELECT  '1',

                        'A',

                        'Z'

                UNION ALL

                SELECT  '2',

                        'b',

                        'y'

     

        SELECT  id,

                [Name],

                SirName

        FROM    #test

        DROP TABLE #test

        RETURN

    GO 

     

     

     

     

  • 2007年7月12日 下午 01:48Mallikarjun n Channappagoudra 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    Hi Thank you very much..

    It is now working fine for the changes you suggested..
  • 2007年8月14日 上午 08:50Mallikarjun n Channappagoudra 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    Hello,

    With the procedure you have told,SSIS package able to detect output of the stored procedure.
    But there another problem introduced bcz of this procedure.Where According to your procedure the SP returns two datasets.
     First dataset having 1 row and this is as a result of First select statement.
     Second dataset bcz of our actual select query.

    So SSIS chooses first dataset,So returns only one row having Null values for all columns.

    How to overcome from this?
  • 2007年8月15日 上午 03:32jaegd 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     

    Post a sproc, or usage of the above sproc, which demonstrates the problem (e.g. OPENQUERY, EXEC, INSERT EXEC, so on...)

  • 2007年11月16日 上午 04:09ajedi2k 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    what if you want to execute a dynamic script i.e.

    Code Block

    create procedure etl.executeScript @scriptId int, @sessionId varchar(50)
    as
        set nocount on
        declare @script nvarchar(max)

        select @script=replace(script,'SESSION-ID',@sessionId)
        from etl.script
        where id=@scriptId
       
        exec sp_executesql  @script
    return



    exec etl.executeScript 1, 'my session'

    basically every script has an id, and a sessionid. ole db command can't pick the meta data coming out of this stored procedure.

    in the etl.script table, usually scripts meta data don't change, mostly it's the where class that changes.

    when executing the ssis package, script id remains the same, the only thing that change is the sessionid. so for the engine meta data never changes, only the body does. for example a tipical script would look like

    select fundid, fundname, descrptin
    from dbo.currentsession
    where sessionid='SESSION-ID'

    so the etl.executeScript stroed procedure replace the sessionid with the passesed sessionid.

    any help as to how i can get ole db source to show up the meta data in the columns section.

    cheers


  • 2007年11月18日 下午 10:30jwelch版主使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    I realize this probably isn't the answer you are looking for, but why not just put in the actual SQL, with a parameter for SessionID? What's the point of using a dynamic script if the metadata will always be the same?

     

  • 2007年11月21日 上午 03:00ajedi2k 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    hi jewlch.
    basically i'm trying to avoide opening up SSIS for every scrpt change. i only want to open SSIS if there's a meta data change to fix it up. also as you probably know there's a sql command text limit of 4000 characters. sometimes my queries get a little big, (trust me they are optimised to the best extent, but some of them have derived queries with in, so no point in breaking up really)


  • 2008年6月11日 下午 10:37Mahesh Shinde 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    Hey I am facing another problem that I have multiple #tables and multiple select statement in Store proce and SSIS says # table does not exist. As suggested by him if I put Return any where in between it will come out without executing multiple record set. Please advice

     

  • 2008年6月13日 下午 09:07jwelch版主使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    Try putting a non-executing SELECT statement at the beginning of the procedure, as jaegd showed earlier in this thread.

     

  • 2008年6月19日 下午 05:44c-j-p 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     

    I've been having similar issues which jaegd's example looked like it would solve. It worked when I tested with a SQL server simple example of a proc using a temp table but failed for a Sybase data source with a more complex proc.

     

    I cannot get this workaround to work with Sybase as the OLEDB source, even with a very simple proc example?

     

    Are there additional complications with using Sybase? 

     

    Many thanks,

    Chris

  • 2009年3月19日 下午 03:38fredd00 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     包含代碼
    Hi I still can't see the outpout columns in OleDb Command Output Columns
    , how can i get the output columns. I want to use them to insert in ole db destination

    here is my sp:
    create PROCEDURE [dbo].[GetData] (
        @user        varchar(50)
    ) AS
    set nocount on
    -- Publish metadata for ssis
    if 1=0
    begin
        select '' x, '' y, '' z
    end

    declare @user_tmp table
    (
        x varchar(max),
        y varchar(max),
        z varchar(max)
    )

    insert into @user_tmp
        select 'x1' x, 'y1' y, 'z1' z

    select distinct *  from @user_tmp
    set nocount off
  • 2009年4月3日 下午 04:31mlop 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     
    i had the same problem--
    there is two things u need to do . u need to alter your stored procedure and add is just after the  begin statment.
    SET
    NOCOUNT ON

    SET


    kkkk
    FMTONLY OFF




  • 2009年4月3日 下午 04:34mlop 使用者勳章使用者勳章使用者勳章使用者勳章使用者勳章
     

    Here is what u need to do alter your stored procdures and just after the

    Begin statement do this

    SET NOCOUNT ON

    SET FMTONLY OFF


    kkkk