不同于SQL Server中NULL表示值是未知的(Unknown Value),没有数据类型,但是,在SSIS中,NULL是有数据类型的,要获取某一个NULL值,必须指定数据类型,例如,变量 Int32的“NULL值”是 NULL(DT_I4),默认值是0。对于变量和参数,不允许有NULL值,因此,NULL值是指默认值,如果变量或参数的值未被显式设置时,SSIS使用默认值。对于Data Flow组件,SSIS保持源数据的NULL值。

一,Variable和Parameter的默认值

在SSIS中,变量不能被设置为NULL,在缺少值时,每种数据类型的变量都会使用默认值:

  • 字符类型的默认值是空字符“”,数据类型是DT_WSTR;
  • 数值类型的默认值是0;
  • Boolean类型的默认值是False;
  • DateTime的默认值是 “12/30/1899 12:00:00 AM”;

例如,变量varIntNull的Data Type是Int32,使用Expression:NULL(DT_I4) 为其赋值,则该变量的默认值是0。

如果需要测试变量是否缺失值,可以将变量的值和变量数据类型对应的默认值进行比较,

例如:@[User::MyStringVar]=="",如果表达式返回True,说明变量缺失值;如果表达式返回False,说明变量有值。

二,在Data Flow Task中处理NULL值

在Data Flow中,NULL有Data Type,必须使用NULL(Data_Type)来获取某个Data Type的NULL。要确定某个值是不是NULL,使用ISNULL(Data_Column),这个函数返回值是boolean,如果返回值是True,说明该数据是NULL。如果当ISNULL(Data_Column)返回true时,替换该数据,可以使用如下语句实现TSQL Isnull 函数相同的功能:ISNULL(Data_Column)? DEFAULT_VALUE : Data_Column

例如,列City是varchar(10),当该列为null时,将其替换为字符串"Unknown",在Derived Column转换组件中,增加一个新列,设置Expression是:

(DT_STR,10,1252)(ISNULL(City) ? "Unknown" : City)

三,故障排除

楼主曾经遇到一个错误:在向OLE DB Destination的中Columns[FullName]插入数据时,违反了完整性约束。

[OLE DB Destination [12]] Error: There was an error with OLE DB Destination.Inputs[OLE DB Destination Input].Columns[FullName] on OLE DB Destination.Inputs[OLE DB Destination Input]. The column status returned was: "The value violated the integrity constraints for the column.".

Integrity Constraint包括:域完整性约束,实体完整性和参考完整性,Columns[FullName] 不具有实体完整性约束(PK) 和参考完整性约束(FK),因此,违反的是域完整性约束。域完整性约束包括:CHECK Constraint,DEFAULT Constraint、NOT NULL Constraint(非空约束),Unique Constraint,排除 check,default,unique约束,违反的Integrity Constraint 就是 Not Null Constraint,即,违反Target Column不能为NULL 的约束。

Data Flow组件不会处理数据列的nullability,错误的Root Cause是OLE DB Source Component 返回的列FullName 存在Null值,但是在OLE DB Destination 组件中,Target Table的列FullName不允许插入Null值,因此,违反了非NULL约束。SSIS在调用 bulk insert 命令插入数据时,SQL Server 检测到数据插入操作违反了表的nullability,停止事务的运行,并向SSIS 报错。

解决方法:

  1. 在数据源中修改,在数据源中,将NULL值替换成默认值;推荐做法,避免NULL值进入Data Flow;
  2. 在数据流中使用Derived Column转换组件,检测到NULL值后,将其替换成默认值;
  3. 修改Target Table Column的Nullability,使该列允许为NULL

SSIS 处理NULL的更多相关文章

  1. SSIS ->> Null & Null Functions

    SSIS不支持值为NULL的变量.每种类型的变量都有自己的默认值. 做了一个测试,用一个Execute SQL Task输出一个NULL值给A变量,然后把A变量传到到另外一个Execute SQL T ...

  2. 《深入理解JAVA虚拟机》笔记1

    java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...

  3. 微软BI 之SSIS 系列 - 对于平面文件中 NULL 值处理过程中容易极易混淆的几个细节

    开篇介绍 最近有人问我有关文件处理中空值处理的相关问题: OLE DB Destination 中的 Keep Nulls 如何控制 NULL 值的显示? 为什么选中了 Keep Nulls 但是数据 ...

  4. Retain NULL values vs Keep NULLs in SSIS Dataflows - Which To Use? (转载)

    There is some confusion as to what the various NULL settings all do in SSIS. In fact in one team whe ...

  5. SSIS Design1: 源数据提取

    数据量的大小由两个方面决定:行的宽度和数据行的数量,为了减少ETL运行的时间,可以从源数据的提取上做优化,从数据源的输入上控制数据的质量和大小,减少转换和IO. 一,减少行的宽度 1,只加载需要的数据 ...

  6. SSISDB1:使用SSISDB管理SSIS Projects

    使用Project Deployment Model,将SSIS Project部署到Integration Services Catalog之后,SSISDB负责管理SSIS Project.在SS ...

  7. SSIS Parameter用法

    今天学习SSISParameter的用法,记录学习的过程. Parameters能够在Project Deployment Model下使用,不能在Package Deployment Model使用 ...

  8. [SSIS] 在脚本里面使用数据库连接字符串进行查询等处理, 入坑

    入坑.!!!!! SSIS 中dts包 设置的  ADO.Net连接, 在传入脚本的时候, 我要使用 数据库连接,进行数据的删除操作. 于是我使用了 了如下的 代码 使用的是windows 身份验证, ...

  9. 数据仓库之SSIS开发

    1.从cdc捕获到数据以后, 连接ssis进行执行数据的抽取以及转换工作,把需要的数据导入到数据仓库, 并且做好对应的日志记录表.现在先说一下比较重要的. 选择参数化设置数据连接, 以方便后面的配置. ...

随机推荐

  1. python基础之初始python

    初始python之基础一 一.Python 介绍 1.python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发 ...

  2. [题解+总结]NOIP2010-2015后四题汇总

    1.前言 正式开始的第一周的任务--把NOIP2010至NOIP2015的所有D1/2的T2/3写出暴力.共22题. 暴力顾名思义,用简单粗暴的方式解题,不以正常的思路思考.能够较好的保证正确性,但是 ...

  3. [XAML]类似WPF绑定的Binding的读取方法

    在WPF的XAML里,依赖属性可以使用基于BindingBase之类的MarkupExtensin 读取XAML时,会自动的把该BindingBase转换为BindingExpressionBase ...

  4. 为什么我如此热爱这样一个比赛(转自vici)

    为什么我如此的热爱这样一个比赛呢?因为它总能带给我一个目标,让我去努力实现它.因为可以看到胜利的希望,于是不断的去追逐.虽然其中的过程可能是比较艰辛的.   对于天才选手,作为天生的冠军,大概凭借天赋 ...

  5. IOS UIAlertController 使用方法

    在很多种语言中,alert都表示弹窗操作,弹窗功能非常有用,不仅可以用于正式的app功能中,也可以在调试中使用.在OC中,UIAlertController类用来控制弹窗操作.在IOS 8.0之前, ...

  6. Python之路第一课Day11--随堂笔记(异步IO\数据库\队列\缓存之二)

    一.RabbitMQ队列 1.安装: a.官网: 安装 http://www.rabbitmq.com/install-standalone-mac.html b.安装python rabbitMQ ...

  7. PHP 通过百度API 实现通过城市名称获取经度

    $city = $_GET['city'];print_r(getjw($city));/*** $city 需要查询的地址* $key 百度开发者账号*/function getjw($city){ ...

  8. input jquery 操作

    本文章主要为了总结开发常用的input等常见html的jquery操作,不是为了展示自己多么菜,只为了积累知识,勿喷!!!不断更新中 $(function () { $("input[nam ...

  9. SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10.50.1600

    http://blog.csdn.net/feng19821209/article/details/8571571 SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10. ...

  10. 安装subversion

    安装subversion需要依赖apr.apr-util.sqlite 下载安装包,放在/usr/file目录 subversion-1.9.4.tar.gz apr-1.5.2.tar.gz apr ...