• sql server导入表格出现错误


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 2301_80663644 2024-03-28 17:38 采纳率: 0% 浏览 12 首页/ 大数据 / sql server导入表格出现错误 sqlserver数据库 正在复制到[ dbo ].[ SC ](错误) 消息错误0xc0202009:数据流任务1:SSIS错误代码 DTS _ E _ OLEDBERROR 。出现 OLE DB 错误。错误代码:0x80004005。已获得 OLE DB 记录。源:" Microsoft SQL Server Native Client 10.0" Hresult :0x80004005说明:"未指定的错误"。( SQL Server 导入和导出向导)错误0xc020901c:数据流任务1:输入" Destination Input "(48)上的输入列" Sno "(80)出错。返回的列状态是:"该值违反了该列的完整性约束。"。( SQL Server 导入和导出向导)错误0xc0209029:数据流任务1:SSIS错误代码 DTS _ E _ INDUCEDTRANSFORMFAILUREONER ROR 。"输入" Destination Input "(48)"失败,错误代码为0xC020907D,而且针对"输入" Destination Input "(48)"的错误行处理设置指定一旦出错就失败。在指定组件的指定对象上出错。可能在此之前已经发出错误消息,提供了有关失败的详细信息。( SQL Server 导入和导出向导)错误0xc0047022:数据流任务1:SSIS错误代码 DTS _ E _ PROCESSINPUTFAILED 。处理输入" Destination Input "(48)时,组件"目标- SC "(35)的 ProcessInput 方法失败,错误代码为0xC0209029。标识的这个组件从 ProcessInput 方法返回了一个错误。虽然该错误是此组件特有的,但却是致命的,将导致数据流任务停止运行。可能在此之前已经发出错误消息,提供了有关失败的详细信息。( SQL Server 导入和导出向导) 一直弄不好 帮忙看一下 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 专家-皆知 2024-03-28 17:38
      关注

      引自免费微信小程序:皆我百晓生

      解决方案:

      1. 检查并更新连接字符串: 在SQL Server Management Studio中,确保你的OleDB连接字符串包含正确的服务器名、数据库名、用户名和密码。例如:

        'Data Source=(localdb)\mssqllocaldb;Initial Catalog=AdventureWorks2019;Integrated Security=True'
        

        确保与实际情况一致,并替换上述字符串中的 AdventureWorks2019为你实际的Adventure Works 2019数据库名称。

      2. 检查OLEDB引用: 在数据源页,确认已正确地定义了OleDB服务的入口点。这是向SSIS应用发送数据的基本途径。若没有配置相应的引用,或者引用的端口无效,可能会导致插入和导出失败。

        ServerName=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
        Source Table=mySourceTable; Destination Table=myDestinationTable;
        

        如果OleDB引用没有成功,可能是由于上述参数未正确配置。尝试更新选项卡并重新配置。

      3. 更新引用内容到Destination Input: 若你在数据源页中定义了引用,但Destination Input列的类型不匹配你插入的数据类型,则你可能需要调整输入列的类型。更改后的输出列类型应与OleDB支持的数据类型相符。通常情况下,列类型包括整数、日期、数字、文本、图片等。

        SELECT *
        INTO #TempTable
        FROM 
        (
           SELECT *,
              CAST(SUM(CASE WHEN Quantity > 0 THEN 1 ELSE -1 END) AS INT) AS Sales,
              ISDATE(SalesDate) AS Date
        ) T
        WHERE Quantity > 0
        ;
        INSERT INTO Destination Table (Sno, Date)
        SELECT sno, dt FROM #TempTable;
        

        这段SQL脚本创建了一个临时表#TempTable,用于存储销售量和日期数据,然后将其插入到Destination Table列中。注意,这里的SalesDate是从#TempTable中选择的日期字段,可以是你的实际日期类型。

      4. 处理Output列异常: 在某些情况下,如果在Output列中发生错误,OleDB驱动程序可能无法正常输出数据。在这种情况下,可能需要将Output列转换为您期望的数据类型,或者根据错误信息判断并采取适当的措施,如抛出异常或重试。

        DECLARE @ErrorCount INT = 0;
        DECLARE @ErrorMessage NVARCHAR(MAX);
        DECLARE @NewColumn VARCHAR(MAX);
        
        SET @ErrorMessage = ''
        WHILE @ErrorCount > 0
        BEGIN
           SELECT @ErrorMessage = ERROR_MESSAGE('%s') + CHARINDEX('Error:', ERROR_CODE) + CHARINDEX('\n', ERROR_CODE) + CHARINDEX(',', ERROR_CODE) INTO @ErrorMessage;
        
           INSERT INTO FailedColumns (ColumnName)
           VALUES (@ErrorMessage);
        
           SET @ErrorCount = @@ROWCOUNT;
           IF @ErrorCount > 0
           BEGIN
              RAISERROR(
                 'Error Code: ' & ERROR_NUMBER + ', ' & @ErrorMessage,
                 'Error Message: ' & @ErrorMessage,
                 16,
                 0
              );
           END
        END
        
        DECLARE @tempTable TABLE (Column1 INT, Column2 DATE)
        
        INSERT INTO @tempTable
        SELECT 
            Column1,
            CAST(SUM(CASE WHEN Quantity > 0 THEN 1 ELSE -1 END) AS DATE) AS SalesDate
        FROM 
        (
           SELECT *,
              CAST(SUM(CASE WHEN Quantity > 0 THEN 1 ELSE -1 END) AS INT) AS Sales,
              ISDATE(SalesDate) AS Date
        ) T
        WHERE Quantity > 0
        ;
        
        INSERT INTO @tempTable
        SELECT 
            SalesDate,
            Column2
        FROM 
        (
           SELECT 
              SalesDate,
              CASE WHEN Quantity > 0 THEN 1 ELSE -1 END AS SalesQuantity
        ) T
        WHERE Quantity > 0
        ;
        
        SELECT * FROM @tempTable;
        
        DELETE FROM FailedColumns;
        

        这段代码首先创建一个临时表FailedColumns,包含所有可能引发错误的输出列列名。接着,通过循环在FailedColumns表中记录每个输出列的错误信息,递归插入到@tempTable表中。最后,删除表FailedColumns,只保留@tempTable表中的输出列列名。

      5. 调试输入和输出数据类型兼容性: 对于输入和输出数据类型不兼容的情况,可以先进行预处理,将数据类型转换为OleDB支持的类型。这可以通过CREATE FUNCTION语句完成。例如:

        CREATE FUNCTION [dbo].[ConvertToOleDbType](@Input NVARCHAR(100), @OutputType NVARCHAR(100))
        RETURNS @ConvertedOutput NVARCHAR(100)
        

      BEGIN DECLARE @ReturnValue NVARCHAR(MAX); DECLARE @ErrorCount INT = 0;

      SET @OutputType = @OutputType.Trim();

      IF NOT EXISTS (SELECT * FROM sys.objects WHERE name = N'ConvertFromOleDbType') BEGIN CREATE FUNCTION [dbo].[ConvertFromOleDbType] (@Input NVARCHAR(100), @OutputType NVARCHAR(100)) RETURNS @ConvertedOutput NVARCHAR(100) AS BEGIN DECLARE @OriginalInput NVARCHAR(100); DECLARE @OriginalOutput NVARCHAR(100);

           SET @Input = REPLACE(@Input, N'[DBC00]', @OutputType);
           SET @OriginalInput = CAST(@Input AS NVARCHAR(100));
      
           EXEC sp_executesql N'SELECT [SUBSTRING_INDEX(@Input, "[", -2)] AS [Column1], [SUBSTRING_INDEX(@Input, "]", -1)] AS [Column2], SUBSTRING_INDEX(@Input, "[", -1)] AS [ConversionError] FROM sys.columns WHERE Name = N'@Input';',
                    @Input, @OutputType, @OriginalInput, NULL, NULL, @ErrorCount OUTPUT;
      
           RETURN @ConvertedOutput;
        END;
      

      END;

      SELECT @Input = CAST(ISNULL([ConversionError], '') AS NVARCHAR(100)) + ', ' + COALESCE(@Input, N'') + ';'; SET @Input = LEFT(@Input, LEN(@Input) - CHARINDEX(N'[DBC00]', @Input)); SET @ConvertedOutput = '[dbo].[ConvertToOleDbType](@Input, ' + LEFT(@Input, LEN(@Input) - CHARINDEX(N'[DBC00]', @Input)) + ')';

      RETURN @ConvertedOutput; END

      
      这段代码定义了一个名为`ConvertToOleDbType`的公共函数,它接受输入数据和输出数据类型作为参数,然后执行转换逻辑。在这个例子中,我们将`Input`列转换为OleDB支持的整数类型`INT`,并将`Output`列的错误信息视为一个字符串存储在变量`ConversionError`中。函数返回转换后的新输入和输出字符串。
      
      在应用程序逻辑中,通过调用`ConvertToOleDbType`函数,将输入数据转换为对应的OleDB支持的数据类型,并在SQL Server Management Studio中观察输出数据是否符合预期。
      
      请注意,以上步骤仅适用于大多数情况,具体取决于你的业务需求和所使用的Microsoft SQL Server版本。在开发过程中,你需要根据实际情况对上述步骤进行适当的调整和优化。同时,确保你的项目有足够的资源和支持特定的OleDB操作,如Create Function,对于大数据集或复杂的需求,可能需要更复杂的解决方案,如分层数据类型映射和事务处理等。
      

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-28 17:38
      关注

      2301_80663644 下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      根据错误信息,这个错误通常是由于数据导入时遇到了完整性约束的问题导致的。以下是可能的解决方案:

      1. 检查完整性约束: 首先,检查目标表中的完整性约束,确保输入的数据符合约束条件。你可以使用SQL Server Management Studio (SSMS)来查看和管理表的完整性约束。

      2. 忽略约束: 如果你确定导入的数据不会违反完整性约束,你可以在导入时选择忽略约束选项。在导入向导中的“选择源表和视图”步骤中,选择“编辑映射”按钮,然后在“目标表或视图”选项卡中勾选“启用约束检查”选项框。

      3. 禁用约束: 另一个解决方案是在导入之前暂时禁用完整性约束。通过以下代码可以禁用表的完整性约束:

      ALTER TABLE [TableName] NOCHECK CONSTRAINT ALL
      

      导入完成后,记得启用约束:

      ALTER TABLE [TableName] CHECK CONSTRAINT ALL
      
      1. 检查数据类型: 确保源数据的数据类型与目标表的数据类型兼容。如果数据类型不匹配,可以考虑在导入之前进行数据转换。

      2. 检查源数据: 确保源数据没有缺失值或格式错误。解决源数据中的问题后,再次尝试导入。

      希望以上解决方案可以帮助你解决问题。如果问题仍然存在,请提供更多的细节和代码,以便我们能够更好地帮助你解决问题。

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    Java对象的相等判定问题与equals方法解析
    深度学习与总结JVM专辑(六):JVM字节码执行引擎
    云原生爱好者周刊:使用树莓派组建 K8s 集群 | 2022-08-08
    深度学习笔记之优化算法(四)Nesterov动量方法的简单认识
    Anolis 8.6 安装 Drawio
    3D建模游戏场景创建大致流程
    【Python】PySpark 数据计算 ① ( RDD#map 方法 | RDD#map 语法 | 传入普通函数 | 传入 lambda 匿名函数 | 链式调用 )
    SolidWorks模型导入到Gazebo中
    v-if与v-show
    redis笔记
  • 原文地址:https://ask.csdn.net/questions/8080473