0

我希望有人可以帮助我。我正在从excel中提取并使用SSIS加载到ole数据库中。在它进入数据库之前,我必须过滤掉具有无效列和空列的行,并将这些有错误的行存储在另一个数据库中以防出错。

这是我的 TransactionRecord Excel 中的数据:

CustID  TransactionDate TransactionTime AmountSpent
123     1/2/2011        10:30           $1 
(null)  3/4/2012       (null)           $8 
789     3/4/2011        12:00           $7 
698     (null)          11:23           $5 

*(null) 表示 excel 中的空字段。

目前,这是我在 SSIS 所做的

TransactionRecord.xlsx ---> Conditional Split --(Case 1:filter rows with null)--> ErrorDB
                                                                      --(默认输出)---> TransactionDB

我只能在以下条件下过滤掉具有空值的行:
ISNULL(CustID) || ISNULL(交易日期) || ISNULL(事务时间) || ISNULL(已花费金额)

但是,使用这种方法,我无法识别哪些是具有空值的列。我正在考虑在 ErrorDB 中有一个 ErrorMsg 列,它将说明哪些是需要更改的列。

错误数据库:

CustID  TransactionDate   TransactionTime   AmountSpent   ErrorMsg
null    3/4/2012          null              $8            CustIDNull, TimeNull
698     null              11:23             $5            DateNull

我尝试使用“派生列”转换来添加新的 ErrorMsg 列,但是,我无法确定哪些列有错误。

有没有更好的方法来提取这些错误列并将它们存储在数据库中?

(无法发布图片,因为我是 stackoverflow 的新手,因此没有足够的声誉点)

4

3 回答 3

0

如果您希望您的 ErrorMsg 列包含发现的第一列错误,则将以下内容添加到派生列中:

ISNULL(CustID) ? "CustID Error" : 
  ISNULL(TransactionDate) ? "TransactionDate Error" :
    ISNULL(TransactionTime) ? "TransactionTime Error" : 
      ISNULL(AmountSpent) ? "AmountSpent Error" : "Unknown Error" 

如果您想要列错误列表,请使用以下内容:

LTRIM((ISNULL(CustID) ? "CustID " : "") +
(ISNULL(TransactionDate) ? "TransactionDate " : "") +
(ISNULL(TransactionTime) ? "TransactionTime " : "") +
(ISNULL(AmountSpent) ? "AmountSpent" : ""))

或者,通过脚本组件转换发送您的错误,然后您可以将其设置为每个错误列写出一行。

于 2013-03-25T12:03:36.407 回答
0
  1. 使用多播转换从主数据流中分离出来
  2. 使用异步脚本组件循环遍历所有列并为具有空值的每一行/列写入一个新行
  3. 将生成的数据流写入您的 ErrorDB

此脚本的代码将类似于:

' Loop through all columns and create field elements
For Each column As IDTSInputColumn100 In Me.ComponentMetaData.InputCollection(0).InputColumnCollection

'Get Column Name
sColumnName = column.Name

' Get column value, will catch if null 
Try

    'Clean up column name (VB/SSIS will do this when processing columns so we need to ask for the value using cleaned up column name)
    sColumnNameClean = column.Name.Trim().Replace(" ", "").Replace(".", "").Replace(":", "").Replace("-", "")

    'Get column value
    sColValue = rowType.GetProperty(sColumnNameClean).GetValue(Row, Nothing).ToString()


Catch

    'Add reference to function to create row here, referencing sColumnName

End Try


Next
于 2013-03-25T12:07:12.680 回答
0

我使用您的数据创建了一个 Excel 2010 文件。

然后我创建了两个表:

CREATE TABLE [123XLSX] (
    [CustID] INT  NOT NULL,
    [TransactionDate] datetime NOT NULL,
    [TransactionTime] datetime NOT NULL,
    [AmountSpent] money NOT NULL
)

CREATE TABLE [123XLSXError] (
    [CustID] VARCHAR(50) NULL,
    [TransactionDate]  VARCHAR(50) NULL,
    [TransactionTime]  VARCHAR(50) NULL,
    [AmountSpent]  VARCHAR(50) NULL,
    [ErrorCode] int,
    [ErrorColumn] int
)

现在,将您的 Excel 源连接到 OleDB Dest(表 123XLSX]。从这个目标,将错误输出发送到另一个 OLEDB Dest(表 123XLSXError)。

结果:

  SELECT * FROM [dbo].[123XLSX]
  SELECT * FROM [dbo].[123XLSXError]

CustID TransactionDate         TransactionTime         AmountSpent
------ ----------------------- ----------------------- ------------
123    2011-01-02 00:00:00.000 1899-12-30 10:30:00.000 1.00
789    2011-03-04 00:00:00.000 1899-12-30 12:00:00.000 7.00

CustID TransactionDate          TransactionTime         AmountSpent ErrorCode  ErrorColumn
------------------------------  -----------             ----------- ----------
NULL   2012-03-04 00:00:00      NULL                     8           -1071607683 41
698    NULL                     1899-12-30 11:23:00      5           -1071607683 42

虽然这不是确切的解决方案,但它会为您提供出错的行及其字段值。

如果你想进一步完善这个结果,这里有几个很好的例子。如果您需要帮助,请告诉我们。

https://naseermuhammed.wordpress.com/tips-tricks/getting-error-column-name-in-ssis/

http://dougbert.com/blog/post/Adding-the-error-column-name-to-an-error-output.aspx

于 2013-03-26T15:46:19.800 回答