如何处理SSIS包中存储过程返回的NULL值?

时间:2011-04-29 13:16:06

标签: sql-server-2005 ssis

我是ssis的新手,我遇到了将包含NULL值的存储过程的结果加载到带有ssis的表中的问题。我所拥有的是:

第1步

对Database1执行存储过程将返回完整结果集并放入ADO对象User::CallResults

第2步

然后我循环遍历User::CallResults映射2个变量的结果:

Variable         Index ADO object Type     Nullable  
User::ID         0      Object              NO  
User::Result     1        Object              Yes    

第3步

然后在Insert Row Into Database2中获取每一行并执行“insert into dbo.myTable id,result values(?,?)”

我将ID分别映射为int和Result。

当我执行时,我收到错误:

failed with the following error: "An error occurred while extracting the result into a variable of type (DBTYPE_I4)". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

如果Result中存在空值,则会出现错误。任何提出ssis的建议都允许空值?

3 个答案:

答案 0 :(得分:2)

您可以使用Data Flow task来完成问题中描述的过程。下面是使用存储过程获取数据然后插入表格的逐步说明,所有操作都在Data Flow task内完成。这个例子只是想知道如何做到这一点,它只使用一个SQL Server实例。

分步流程:

  1. 创建两个名为dbo.Sourcedbo.Destination的表,并使用数据填充表dbo.Source,如屏幕截图# 1 所示。创建表脚本在脚本部分下提供。

  2. 使用 Scripts 部分下提供的脚本创建名为dbo.GetData的存储过程。

  3. 在SSIS包上,创建名为StoredProcedure的变量,如屏幕截图# 2 所示。该变量将包含存储过程执行语句。

  4. 在连接管理器中创建OLE DB Connection以连接到SQL Server实例。

  5. 在SSIS包的Control Flow标签上,放置Data Flow task,如屏幕截图# 3 所示。

  6. 双击Data flow task以导航至Data Flow标签。在“数据流”标签内,放置OLE DB SourceOLE DB Destination,如屏幕截图# 4 所示。

  7. 配置OLE DB Source,如屏幕截图# 5 和# 6 所示。请注意,源正在使用在步骤#3中创建的变量。存储过程返回的数据将是源输入。

  8. 配置“OLE DB目标”,如屏幕截图# 7 和# 8 所示。这会将数据插入目标表。

  9. 屏幕截图# 9 显示示例包执行。

  10. 屏幕截图# 10 显示程序包执行后表中的数据。请注意,目标表包含NULL个值。这是可能的,因为 Qty 列可以接受NULL值。但是,如果我们已将NULL值传递给 ItemNumber 列,则该包将失败,因为该列不可为空。

  11. 希望有所帮助。

    <强>脚本:

    CREATE TABLE [dbo].[Destination](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ItemNumber] [varchar](50) NOT NULL,
        [Qty] [int] NULL,
    CONSTRAINT [PK_Destination] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
    GO
    
    CREATE TABLE [dbo].[Source](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ItemNumber] [varchar](50) NOT NULL,
        [Qty] [int] NULL,
    CONSTRAINT [PK_Source] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
    GO
    
    CREATE PROCEDURE [dbo].[GetData]
    AS
    BEGIN
        SET NOCOUNT ON;
    
        SELECT      Id
                ,   ItemNumber
                ,   Qty
        FROM        dbo.Source
    END
    GO
    

    屏幕截图#1:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8

    屏幕截图#9:

    9

    屏幕截图#10:

    10

答案 1 :(得分:1)

不是一个真正的答案,但由于代码无法在评论中很好地格式化,我将它放在这里。

您是否意识到,如果您的数据库位于同一台服务器上,您可以执行此操作:

INSERT INTO 
    database1.dbo.Results
EXEC 
    database2.dbo.SampleStoredProcedure @param1, @param2, @param3

答案 2 :(得分:0)

将此逻辑放入数据流中。完成之后,只需执行批量插入,它应该允许空值。

SSIS - Unable to insert NULL for Blank fields in BULK INSERT