我希望有人可以帮助我。我正在从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 --->条件分割 - (案例1:过滤行为空) - > ErrorDB
- (默认输出)---> TransactionDB
我只能使用以下条件过滤掉具有空值的行:
ISNULL(CustID)|| ISNULL(TransactionDate)|| ISNULL(TransactionTime)|| ISNULL(AmountSpent)
但是,使用此方法,我无法确定哪些列具有空值。我想在ErrorDB中有一个ErrorMsg列,它将说明哪些列需要更改。
ErrorDB:
CustID TransactionDate TransactionTime AmountSpent ErrorMsg
null 3/4/2012 null $8 CustIDNull, TimeNull
698 null 11:23 $5 DateNull
我尝试使用“派生列”转换来添加新的ErrorMsg列,但是,我无法确定哪些列有错误。
有没有更好的方法来提取这些错误列并将它们存储在数据库中?
(无法发布图片,因为我是stackoverflow的新手,因此没有足够的声誉点)
答案 0 :(得分: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" : ""))
或者通过脚本组件转换发送错误,然后可以设置为每个错误列写出一行。
答案 1 :(得分:0)
此脚本的代码类似于:
' 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
答案 2 :(得分: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