错误“... OLE DB Source.Outputs [OLE DB源输出] .Columns [XXXXXXXX]上的非错误输出没有相应的输出

时间:2014-01-08 20:01:13

标签: sql-server ssis dynamics-crm-2011

我花了好几个小时试图解决这个问题。对于给我问题的列我在sql server中使用标量函数来获取名称。功能正确,工作正常。然后我使用存储过程与ssis一起使用。给出错误的列声明它在错误输出上没有相应的输出列。一切似乎都很好。我按照之前的建议做了以下几点:

  1. 删除了源和目标并重新映射了所有内容
  2. 将DelayValidation属性更改为true
  3. 将最大错误次数更改为100
  4. 未选中并重新检查来源
  5. 中的可用外部列

    这些是以前论坛的推荐。

    我是一名实习生,希望自己得到这个,而不必问我的经理。我花了无数个小时试图解决这个问题。

    有什么建议吗?

    编辑增加问题值

    以下是我在OLE DB源中的查询

    SELECT *
    FROM RExtenstionBase R
    LEFT OUTER JOIN AExtensionBase A
    ON R.ASN = A.SN
    AND R.ARN = A.R
    

    此查询为我提供了Dynamics CRM所需的字段。

    以下是我在OLE DB命令中的存储过程调用:

    EXEC InsertRepairs ?,?,?,?,?,?,?,?,?,?
    

    以下是我的存储过程脚本:

    USE [MSCRM_RC]
    GO
    
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[InsertRepairs] 
        -- Add the parameters for the stored procedure here
    
        @ROID nvarchar(100),
        @AType nvarchar(100),
        @ARN nvarchar(100),
        @DateReceived datetime,
        @RForRR nvarchar(100),
        @C nvarchar(100),
        @SN nvarchar(100),
        @ASN nvarchar(100),
        @Performed nvarchar(100),
        @COR decimal
    
    
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
        DECLARE @newID AS UNIQUEIDENTIFIER
        SET @newID = NEWID()
    
    INSERT INTO [dbo].[A_RBase] /***BASE TABLE ALWAYS THE SAME ***/
               ([A_RCRIDID] /*Always change this tho */
               ,[CreatedOn]
               ,[CreatedBy]
               ,[ModifiedOn]
               ,[ModifiedBy]
               ,[CreatedOnBehalfBy]
               ,[ModifiedOnBehalfBy]
               ,[OwnerId]
               ,[OwnerIdType]
               ,[OwningBusinessUnit]
               ,[statecode]
               ,[statuscode]
               ,[ImportSequenceNumber]
               ,[OverriddenCreatedOn]
               ,[TimeZoneRuleVersionNumber]
               ,[UTCConversionTimeZoneCode])
         VALUES
               (@newID
               ,GETUTCDATE() -- CreatedOn
               ,'XXXXXXXXXXXXXXXXXXXXXXX' -- CreatedBy
               ,GETUTCDATE()                            -- ModifiedOn
               ,'XXXXXXXXXXXXXXXXXXXXXXX'   -- ModifiedBy
               ,NULL                                    -- CreatedOnBehalf
               ,NULL                                    -- Modified''
               ,'XXXXXXXXXXXXXXXXXXXXXXX'   -- OwnderId
               ,8
               ,'XXXXXXXXXXXXXXXXXXXXXXX'
               ,0                                       -- statecode
               ,1                                       -- statuscode
               ,5                                       -- ImportSequenceNumber
               ,NULL                                -- Overrid
               ,0                                       -- TimeZoneRule 
               ,NULL)                                   -- UTCConversion
    
    
    
    
    INSERT INTO [dbo].[A_RExtensionBase]
               ([A_RCRID]
            ,[A_Name]
               ,[A_AType]
            ,[A_ARN]
               ,[A_DateReceived]
               ,[A_RForRR]
            ,[A_C]
            ,[A_SN]
            ,[A_ASN]
               ,[A_Performed]
               ,[A_COR])
         VALUES
               (@newID,
             @ROID,
             @AType,
             @ARN,
                @DateReceived,
                @RForRR,
             @C,
             dbo.Lookup_SNID_GUID(@SN)
             @ASN,
                @Performed ,
             @COR)
    
    
    END
    

    以下是我的标量值函数:

    USE [MSCRM_RC]
    GO
    
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    ALTER FUNCTION [dbo].[Lookup_SNID_GUID] 
    (
          -- Add the parameters for the function here
          @SN_Name nvarchar(100)
    )
    RETURNS UNIQUEIDENTIFIER
    AS
    BEGIN
          -- Declare the return variable here
          DECLARE @SN_GUID UNIQUEIDENTIFIER
          SELECT @SN_GUID = SNID
    
          FROM SNExtensionBase
          WHERE name = (@SN_Name)
    
          RETURN @SN_GUID
    END
    

3 个答案:

答案 0 :(得分:70)

显然这是SSIS包的常见错误。我通过钻入OLE DB源,单击列选项卡,找到错误消息中包含的可用外部列,然后取消选中复选框并重新检查它来消除错误。错误解决了!

答案 1 :(得分:2)

当向需要由现有SSIS包处理的表添加新列时,我经常遇到错误“错误输出没有相应的输出”。此错误附带一条错误消息,指出“值不在预期范围内”。

新添加的列需要由现有SSIS包处理。预期的行为是SSIS将识别出有一个新列,并在要处理的OLEDB源任务SSIS的列页面上选择此列。但是,在修改表格后第一次打开OLEDB源任务时,我收到以下错误消息的两倍:“值不在预期范围内。”打开编辑器和打开编辑器的“列”页面时出现错误消息。在OLEDB源任务的高级编辑器中,新列显示在OLEDB源输出列树中,但不显示在OLEDB源错误输出列树中。这是错误消息的实际根本问题。不幸的是,似乎无法手动添加缺失的列。

要解决此问题,请删除并重新添加正常编辑器的Columnns页面上新添加的列,如Jeff所述。

可能值得一提的是,OLEDB Source任务的数据源是修改后的MDS View。 Microsoft CRM Dynamics也在使用视图。这导致我得出结论,在修改数据类型或添加/删除列时,使用视图作为数据源可能会产生上述错误之一。

相关主题:How to fix SSIS : "Value, does not fall within expected range"?

所描述的解决方法是指使用Mircorsoft.NET Framework 3.5 SP1的Visual Studio 2008版本9.0.30729.4462 QFE。该数据库是SQL Server 2008 R2(SP2)。

答案 2 :(得分:0)

如果我错了,请纠正我,但是我发现在从源中获取数据时单击“预览”按钮会导致为列设置错误的长度,特别是对于字符串。 这可能是因为长度是根据预览数据确定的。因此,更好的做法是在选择source-table后单击Source-dialog中的Columns-tab。主要是使用ODBC源。