有没有办法判断哪个派生列失败了?

Mik*_*e G 7 sql-server ssis-2012

在 SSIS 数据流任务中,我们有一个包含大约 100 列的派生列转换(基本上将原始输入字符串数据转换为类型化变量)。当此任务失败时,是否有任何方法可以判断是哪一列导致失败,以用于日志记录?我能想到的唯一其他替代方法是自定义脚本任务来单独执行每个转换 (yuck) 或每个数据点的单独派生列转换 (doubleyuck)。

基本上我只想能够重定向失败行并知道它们为什么失败。


所以举个例子。我们的软件包用于允许用户使用 Excel 电子表格批量上传到我们的数据库。所以让我们说进来的电子表格看起来像这样(除了有数百列):

+--------+-----------------+---------+------------+---------+
| Text1  |     Number1     | Number2 | DateTime1  |  Text2  |
+--------+-----------------+---------+------------+---------+
| Spring | 1               |       1 | 1/1/0001   | Flowers |
| Summer | 2               |       2 | 6/1/2015   | Sweaty  |
| Fall   | N/A             |       3 | 10/31/2099 | Crunchy |
| Winter | This is garbage |       4 | 12/12/2020 | Icy     |
+--------+-----------------+---------+------------+---------+
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们希望 Spring、Summer 和 Fall 成功。Fall with 为 null 值Number1。派生列的逻辑看起来像这样(不是有效的语法,只是逻辑)

sanitizedNumber1 = Number1 == "N/A" ? null : cast(Number1 as int)
Run Code Online (Sandbox Code Playgroud)

Winter将被重定向到错误路径并记录下来。有没有办法知道哪个派生列失败了?同样,我们有大约 100 个输入正在以类似的方式在此转换中进行处理。我希望能够记录以下内容:

由于“Number1”中的数据无效,导入记录“Winter”失败

它不一定必须是这种格式,但任何允许用户能够唯一识别错误数据点的内容都是可以接受的。我知道这可以使用脚本组件并手动执行转换(如果没有更好的选择,这是我们将要做的)但是如果有可能只修改派生列转换以提供一些沿着这些路线的东西我宁愿这样做,而不是在脚本中重新实现整个组件。

Dav*_*ave 1

您必须手动识别故障。

\n\n

将行(如您当前的状态)重定向到与您的列匹配的表中,并添加一个 IDENTITY 列。该表应该是所有VARCHAR数据类型,以便您保留所有原始值。

\n\n

现在,您可以在查询表时使用TRY_CAST来识别失败。

\n\n

例如:

\n\n
SELECT\nIdentity,\nTRY_CAST(Winter As INT) As WinterConverted,\nWinter\n--------------------------------------\nIdentity  |  WinterConverted   | Winter\n   1      |    NULL            | NaN\n
Run Code Online (Sandbox Code Playgroud)\n\n

WinterTRY_CAST 未能将列中的值转换为 ,int留下null. 您可以对所有列执行此操作。

\n\n

如果值得您花时间,您可以进行更复杂的查询来返回包含 NULL 的每个列名。如果没有,您应该能够相对轻松地进行目视检查。

\n\n

当然,如果您的大多数错误都是“NaN”或“N/A”,那么您很可能正在浪费时间来识别您已经知道的错误。在问题成为问题之前清理它们:

\n\n
Winter == "NaN" || Winter == "N/A" ? -1 : (DT_I4)Winter\n
Run Code Online (Sandbox Code Playgroud)\n\n

顺便说一句,您可以TRY_CAST通过使用垂直编辑轻松添加 100 列:在 SSDT 或 SSMS(还有其他一些应用程序)中按住Alt+ ,然后或,然后同时编辑数百行。Shift\xe2\x86\x91\xe2\x86\x93

\n