如何使用SSIS包创建避免数据库表中的NULL值?

时间:2014-07-26 17:43:22

标签: sql excel ssis business-intelligence ssis-2012

我正在使用SQL Server商业智能开发工作室 - >集成服务项目

我的任务是使用Excel文件作为输入源。将Excel工作表值插入DB [目标源]表[SQL 2008]

我的Excel格式[我使用的是MS-Office 2013]

 ID|Tier|TierType|Age|Count
 ==========================
 1   4             18  0.652
 2   4    EV           2.569
 3   5    EG       25  1.035
 .   .    .         .   .
 .   .    .         .   .
 .   .    .         .   .
800  4    EE       40  1.526

我的数据库表设计

Tier    - int
TierType- varchar(5)
Age     - int
Count   - float

表输出。

ID|Tier|TierType|Age|Count
==========================
1   4    NULL     18   0.652
2   4    EV       NULL 2.569
3   5    EG       25   1.035
.   .    .         .   .
.   .    .         .   .
.   .    .         .   .
800 4    EE       40  1.526

我能够成功地将Excel工作表值插入到数据库表中。

我的问题是

在Excel工作表中,前9个记录中的前8个记录为空,下面是以下示例: -

ID|Tier|TierType|Age|Count
==========================
1  
2
3
4
5
6
7
8
9  4      EE     20   0.256

如果前8个记录为空,则剩余的值也会在DB表中显示为null(int [Tier,Age],float [Count])。值数值正确显示

表输出。

ID|Tier|TierType|Age|Count
==========================
1   NULL  NULL   NULL  NULL 
2   NULL  NULL   NULL  NULL 
3   NULL  NULL   NULL  NULL 
4   NULL  NULL   NULL  NULL 
5   NULL  NULL   NULL  NULL 
6   NULL  NULL   NULL  NULL 
7   NULL  NULL   NULL  NULL 
8   NULL  NULL   NULL  NULL 
9   NULL  EE     NULL  NULL 
.
.
.
800 NULL  EC     NULL  NULL

请告诉它默认问题或我在创建包时犯了错误。

2 个答案:

答案 0 :(得分:0)

我会在Excel源和OLE DB目标之间添加一个条件性拆分组件。然后我会在那里使用一个表达式来检测何时有空值。如果Teir为null就足够了,那么你的表达式就是

IsNull([Tier])

如果您需要检查所有字段是否为空,那么您可以使用&&和运算符使其像

一样
IsNull([Tier]) && IsNull([TierType]) && IsNull([Age]) && IsNull([Count])

无论您的业务逻辑是什么,请使用此类表达式过滤掉所有空行。

@JodyT提到的一个替代方案是,如果总是 N行为空,那么您可以修改连接管理器以跳过这些行。

答案 1 :(得分:0)

excel提供程序使用前8行来确定数据类型。 (more info)您可以通过更改服务器上的注册表设置来更改该行为,但如果前8行始终为空,那么您还可以在excel表上使用带有范围的查询(而不是整个片):

SELECT * FROM [Sheet1 $ range]

SELECT * FROM [Sheet1 $ A2:B10]