SQL Server:找出导致TSQL失败的行(SSIS)

Dev*_*MCT 5 t-sql sql-server ssis sql-server-2005

SQL Server 2005问题:

我正在进行一个数据转换项目,我正在使用80k +行并将它们从一个表移动到另一个表.当我运行TSQL时,它会因为转换类型或其他任何错误而遭受各种错误的轰炸.有没有办法找出导致错误的行?

=====================

更新:

我正在执行INSERT INTO TABLE1(...)SELECT ... FROM TABLE2 Table2只是一堆varchar字段,其中TABLE1具有正确的类型.

此脚本将放入sproc并从SSIS包执行.SSIS包首先将5个大型平面文件导入TABLE2.

下面是一个示例错误消息:"将char数据类型转换为datetime数据类型会导致超出范围的datetime值."

有许多日期字段.在TABLE2中,有一些数据值,例如Birthdate的'02/05/1075'.我想检查导致错误的每一行,因此我可以向负责坏数据的部门报告,以便他们可以纠正错误.

Joh*_*ers 5

这不是用SSIS做的方法.您应该拥有从源到目的地的数据流,以及中间需要的任何转换.通过使用目标的错误输出,您将能够获取错误详细信息,实际上是错误行.

我经常将目的地的错误输出发送到另一个目的地 - 文本文件或设置为允许所有内容的表,包括在真实目的地中无效的数据.


实际上,如果在SSIS中以标准方式执行此操作,则应在设计时检测数据类型不匹配.


Chr*_*all 3

我所做的就是使用 WHERE 子句将行集分成两半:

INSERT MyTable(id, datecol) SELECT id, datecol FROM OtherTable WHERE ID BETWEEN 0 AND 40,000
Run Code Online (Sandbox Code Playgroud)

然后不断更改 where 子句之间的值。我已经多次手动完成此操作,但我突然想到,您可以在循环中使用一些 .Net 代码自动进行分割,捕获异常,然后将其范围缩小到仅抛出异常的行,一点一点地。

  • 错误的语法和解决问题的糟糕想法。它会起作用(一旦纠正语法错误),但效率最低,并且确实需要手动完成,而不是在包中运行。使用 isdate() 函数可以轻松识别错误日期。 (4认同)