不同于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. SOAPUI使用教程-MockService脚本概述

    虽然静态MockOperation和MockResponse模型可以给你一定的灵活性,更多的动态行为添加到您的服务让您更模拟复杂的服务功能是很有用的.例如,你可能想: 从请求到响应传输值,修改它们的值 ...

  2. javascript常识

    substring和substr的区别 substring() 方法用于提取字符串中介于两个指定下标之间的字符. stringObject.substring(start,stop)例子: <s ...

  3. Hadoop各商业发行版之比较

    Hadoop的发行版除了社区的Apache hadoop外,cloudera,hortonworks,mapR,EMC,IBM,INTEL,华为等等都提供了自己的商业版本.商业版主要是提供了专业的技术 ...

  4. javascript运行机制

    太久没更新博客了,Javascript运行机制 Record it 1.代码块 JavaScript中的代码块是指由<script>标签分割的代码段.例如: <script type ...

  5. db2定界符

    在DB2数据库中,在导出DEL文件时,默认的字符分隔符是".字段分隔符是, (逗号).有一个需求是要为Oracle数据库提供数据,因此就想使用"|"作为数据的字段分隔符. ...

  6. 设置Flush刷新模式setFlushMode()

    参考 http://blog.csdn.net/superdog007/article/details/38852399 FlushMode的枚举值: FlushMode.ALWAYS:任务一条SQL ...

  7. sql查询重复数据

    select *from Awhere id in (select id from A group by id having count(1) >= 2) 注释:id 为重复的关键字(更换成所需 ...

  8. JS键盘KEYCODE值参考

    keycode 1 = 鼠标左键keycode 2 = 鼠标右键keycode 3 = Cancelkeycode 4 = 鼠标中键keycode 8 = BackSpace keycode 9 = ...

  9. [LintCode] Trapping Rain Water 收集雨水

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  10. Python之路Day18-正则及Django

    一. 正则表达式 1.定义正则表达式 /.../  用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配JS正则匹配时本身就是支持多行,此处多行匹 ...