(转)SSIS处理导入数据时, 存在的更新, 不存在的插入
问题描述:
当你把数据从其他数据库, 或者是文本文件之类的其他数据源导入到目的数据库时, 有时希望在导入的处理中, 能够实现"数据存在时更新, 不存在时导入"
在之前, 一般是通过导入临时表, 然后再判断处理导入正式表的, 在SQL Server 2005中, SSIS可以在导入处理时直接完成这种处理.
下面具体演示一下如何用SSIS完成这样的处理:
- 1. 准备测试环境
-- 1. 在数据库中创建下面的对象
USE tempdb
GO
CREATE TABLE dbo.tb(
id int PRIMARY KEY,
name nvarchar(128))
GO
-- 2. 准备两个文本文件, 放在d:/test 目录下, 文件的内容如下
t1.txt
id name
1 张三
2 李四
t2.txt
id name
1 张三君
3 李林
4 阿联酋
- 2. 创建新的 Integration Services 项目(创建SSIS包)
- 在“开始”菜单中,依次指向“所有程序”、“Microsoft SQL Server 2005”,再单击 SQL Server Business Intelligence Development Studio。
- 在“文件”菜单中,指向“新建”,再单击“项目”,以创建一个新的 Integration Services 项目。
- 在“新建项目”对话框的“模板”窗格中,选择“Integration Services 项目”。
- 在“名称”框中,将默认名称更改为 SSIS Tutorial。或者,清除“创建解决方案的目录”复选框。
- 接受默认位置,或单击“浏览”,以浏览并找到要使用的文件夹。
- 在“项目位置”对话框中,单击文件夹,再单击“打开”。
- 单击“确定”。
- 默认情况下,将创建一个名为 “新建包.dtsx“的空包,并将该包添加到项目中。
- 在解决方案资源管理器工具栏中,右键单击 Package.dtsx,再单击“重命名”,将默认包重命名为 Lesson 1.dtsx。
- 当系统提示重命名包对象时,单击“是”。
- 3. 为SSIS包添加数据源(导入数据的源和目标数据源)
- 首先添加导入数据的源
- 右键单击“连接管理器”区域中的任意位置,再单击“新建平面文件连接”。
- 在“平面文件连接管理器编辑器”对话框的“连接管理器名称”字段中,键入 Source。
- 单击“浏览”。
- 在“打开”对话框中,浏览并找到“d:/test/t1.txt”文件。
- “常规”选项中,勾选“在第1个数据行中显示列名称”。
- “高级”选项中,选择“id”列,将数据类型设置为“four-byte single integer[DT_I4]”。
- “高级”选项中,选择“name”列,将数据类型设置为“Unicode string[DT_WSTR]”。
- 然后,你可以在“预览”中查看数据是否正确。
- 然后添加接收数据的目的数据源
- 右键单击连接管理器区域中的任意位置,再单击“新建OLE DB 连接”。
- 在“配置OLE DB 连接管理器”对话框中,单击“新建”。
- 在“服务器名称”中,输入localhost。
- 将localhost 指定为服务器名称时,连接管理器将连接到本地计算机上Microsoft SQL Server 2005 的默认实例。若要使用SQL Server 2005 的远程实例,请将localhost 替换为要连接到的服务器的名称。
- 在“登录到服务器”组中,确认选择了“使用Windows 身份验证”。
- 在“连接到数据库”组的“选择或输入数据库名称”框中,键入或选择tempdb。
- 单击“测试连接”,验证指定的连接设置是否有效。
- 单击“确定”。
- 单击“确定”。
- 在“配置OLE DB 连接管理器”对话框的“数据连接”窗格中,确认选择了localhost.tempdb。
- 单击“确定”。
- 4. 为SSIS包添加数据流任务
- 单击“控制流”选项卡。
- 在“工具箱”中,展开“控制流项”,并将一个数据流任务拖到“控制流”选项卡的设计图面上。
- 在“控制流”设计图面中,右键单击新添加的数据流任务,再单击“重命名”,将名称更改为Import Data。
- 5. 在数据流任务中设置数据流源
- 打开“数据流”设计器,方法是双击Import Data 数据流任务或单击“数据流”选项卡。
- 在“工具箱”中,展开“数据流源”,然后将“平面文件源”拖动到“数据流”选项卡的设计图面上。
- 在“数据流”设计图面上,右键单击新添加的“平面文件源”,单击“重命名”,然后将该名称更改为Source Data。
- 双击此平面文件源,打开“平面文件源编辑器”对话框。
- 在“平面文件连接管理器”框中,键入或选择Source。
- 单击“列”并验证列名是否正确。
- 单击“确定”。
- 6. 在数据流任务中添加查找处理组件
- 在“工具箱”中,展开“数据流转换”,然后将“查找”拖动到“数据流”选项卡的设计图面上。将“查找”直接放置在Source Data 源的下面。
- 单击Source Data 平面文件源,并将绿色箭头拖动到新添加的“查找”转换中,以连接这两个组件。
- 在“数据流”设计图面上,右键单击新添加的“查找”转换,单击“重命名”,然后将该名称更改为Lookup id。
- 双击Lookup id 转换。
- 在“查找转换编辑器”对话框的“OLE DB 连接管理器”框中,确保显示localhost.tempdb。
- 在“使用表或视图”框中,键入或选择[dbo].[tb]。
- 单击“列”选项卡。
- 在“可用输入列”面板中,将id 拖放到“可用查找列”面板的id 上。
- 单击“确定”。
- 7. 在数据流任务中添加插入数据处理需要的目标数据源
- 在“工具箱”中,展开“数据流目标”,并将“OLE DB 目标”拖到“数据流”选项卡的设计图面上。将OLE DB 目标直接放置在“Lookup id”转换的下面。
- 单击“Lookup id”转换,并将红色箭头拖到新添加的“OLE DB 目标”上,以便将两个组件连接在一起。
- 在出现的“配置错误输出”对话框中,“错误”列中选择“重定向行”
- 单击“确定”。
- 在“数据流”设计图面上,右键单击新添加的“OLE DB 目标”组件,单击“重命名”,然后将名称更改为Insert data。
- 双击Insert data。
- 在“OLE DB 目标编辑器”对话框中,确保已在“OLE DB 连接管理器”框中选中localhost.tempdb。
- 在“表或视图的名称”框中,键入或选择[dbo].[tb]。
- 单击“映射”。
- 验证id, name 输入列是否已正确映射到目标列。如果映射了同名列,则说明映射正确。
- 单击“确定”。
- 8. 在数据流任务中添加更新数据处理需要的OLE DB命令组件
- 在“工具箱”中,展开“数据流组件转换”,并将“OLE DB 命令”拖到“数据流”选项卡的设计图面上。将OLE DB 目标直接放置在“Lookup id”转换的下面。
- 单击“Lookup id”转换,并将绿色箭头拖到新添加的“OLE DB 命令”上,以便将两个组件连接在一起。
- 在“数据流”设计图面上,右键单击新添加的“OLE DB命令”组件,单击“重命名”,然后将名称更改为Update data。
- 双击Update data。
- 在“Update Data 高级编辑器”对话框中,“连接管理”选项的“连接管理器”列中,选中localhost.tempdb。
- 在“组件属性”选项中,“自定义属性”的“SQLCommand”属性中输入:
UPDATE dbo.tb SET name = ? WHERE id = ?
- 在“列映射”选项中,设置“输入列”,将name映射到param_0,将id映射到param_1。注:param_0对应UPDAT语句中的第1个?,而param_1对应UPDATE语句中的第2个?,这是固定的。
- 单击“确定”。
- 9. 测试
- 按“F5”执行SSIS包
- 执行结束(所有的组件都变为绿色),你会看到数据流向“Inset Data”的有两条数据
- 双击“连接管理器”中的Source,重新设置文件名为D:/test/d2.txt。
- 单击“确定”
- 按“Ctrl+Shift+F5”,重新启动SSIS
- 执行结束(所有的组件都变为绿色),你会看到数据流向“Inset Data”的有两条数据,流向“Update Data”的有1条数据
- 最后,在数据库中查询tempdb.dbo.tb,验证数据导入的正确性
- 10. 添加循环,一次完成test目录下所有文件的导入
- 在Business Intelligence Development Studio 中,单击“控制流”选项卡。
- 在“工具箱”中,展开“控制流项”,然后将“Foreach 循环容器”拖到“控制流”选项卡的设计图面上。
- 右键单击新添加的“Foreach 循环容器”,并选择“编辑”。
- 在“Foreach 循环编辑器”对话框的“常规”页中,为“名称”输入Foreach File in Folder。单击“确定”。
- 为Foreach 循环容器配置枚举器
- 双击文件夹中的Foreach 文件以重新打开“Foreach 循环编辑器”。
- 单击“集合”。
- 在“集合”页中,选择“Foreach 文件枚举器”。
- 在“枚举器配置”组中,单击“浏览”。
- 在“浏览文件夹”对话框中,找到d:/test。
- 在“文件”框中,键入*.txt。
- 单击“变量映射”,将枚举器映射为用户定义的变量。
- 在“变量映射”页的“变量”列中,单击空单元格并选择“<新建变量…>”。
- 在“添加变量”对话框中,为“名称”键入varFileName。
- 单击“确定”。
- 再次单击“确定”,退出“Foreach 循环编辑器”对话框。
- 将数据流任务Import Data 数据流任务拖动到现已重命名为Foreach File in Folder 的Foreach 循环容器中。
- 配置平面文件连接管理器以使用连接字符串的变量
- 在“连接管理器”窗格中,右键单击Source Data,再选择“属性”。
- 在“属性”窗口中,针对“表达式”,单击空单元,然后单击省略号按钮“(…)”。
- 在“属性表达式编辑器”对话框的“属性”列中,键入或选择ConnectionString。
- 在“表达式”列中,单击省略号按钮“(…)”以打开“表达式生成器”对话框。
- 在“表达式生成器”对话框中,展开“变量”节点。
- 将变量用户::varFileName 拖到“表达式”框中。
- 单击“确定”关闭“表达式生成器”对话框。
- 再次单击“确定”关闭“属性表达式编辑器”对话框。
转自: http://blog.csdn.net/zjcxc/article/details/1202876
(转)SSIS处理导入数据时, 存在的更新, 不存在的插入的更多相关文章
- 转 SSIS处理导入数据时, 存在的更新, 不存在的插入
SSIS处理导入数据时, 存在的更新, 不存在的插入 分类: DTS/SSIS2006-09-10 12:43 18185人阅读 评论(22) 收藏 举报 ssissql servermicrosof ...
- SQL Server导入数据时“启用标示插入”详解
在SQL Server中导入数据时,会有一个"启用标示插入"的选项,突然间懵逼了,这到底啥意思?我选与不选这个选项,结果好像没区别!不科学啊这,"存在即合理", ...
- [MySQL]load data local infile向MySQL数据库中导入数据时,无法导入和字段不分离问题。
利用load data将文件中的数据导入数据库表中的时候,遇到了两个问题. 首先是load data命令无法执行的问题: 命令行下输入load data local infile "path ...
- SQLSERVER:大容量导入数据时保留标识值 (SQL Server)
从MSDN上看到实现大容量导入数据时保留标识值得方法包含三种: MSDN链接地址为:https://msdn.microsoft.com/zh-cn/library/ms178129.aspx 感觉M ...
- MSSQL导入数据时,出现“无法截断表 因为表正由Foreign key引用”错误
* 错误 0xc002f210: 准备 SQL 任务: 执行查询“TRUNCATE TABLE [dsc100552_db].[dbo].[ALV_SalesBigClass] ”失败,错误如下:“无 ...
- 使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误
1.原表没有设置主键,出现错误提示: ERROR tool.ImportTool: Error during import: No primary key could be found for tab ...
- 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法
注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...
- DB2导入数据时乱码问题
1.由于导入import导入数据时乱码,一直找不到解决办法,于是就用load导入 LOAD后,发现某些表检查挂起( 原因码为 "1",所以不允许操作 SQLSTATE=57016 ...
- 导入数据时出现“SqlDateTime 溢出
错误出现:导入数据时出现“SqlDateTime 溢出.必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间.” 出现这种问题多半是因为你插入或者更 ...
随机推荐
- JBPM4.4_核心概念与相关API
1. 核心概念与相关API(Service API) 1.1. 概念:Process definition, process instance , execution 1.1.1. Process ...
- day04<Java语言基础+>
Java语言基础(循环结构概述和for语句的格式及其使用) Java语言基础(循环结构for语句的练习之获取数据) Java语言基础(循环结构for语句的练习之求和思想) Java语言基础(循环结构f ...
- H5 readfile 多图片预览
/** * 多图片前端预览 * @author Tiac */ function preView(_this, offset){ let max_nums = 10;//单位 s let max_si ...
- Unity中Oculus分屏相机和普通相机一键切换
Unity中Oculus分屏相机和普通相机一键切换 一.OCulus 分屏相机介绍 在VR开发工程中,总会觉得OC分屏的处理太慢,严重浪费时间啊! 但是不使用有不好调试,来回切换相机就成为了一个必须. ...
- poj_3579 二分法
题目大意 给定N个数,这些数字两两求差构成C(N,2)(即N*(N-1)/2)个数值,求这C(N,2)个数的中位数.N <= 100000. 题目分析 根据数据规模N最大为100000,可知不能 ...
- poj_1182 并查集
题目大意 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人 ...
- AVL 平衡树
AVL是一种平衡二叉树,它通过对二叉搜索树中的节点进行旋转使得二叉搜索树达到平衡.AVL在所有的平衡二叉搜索树中具有最高的平衡性. 定义 平衡二叉树或者为空树或者为满足如下性质的二叉搜索树: 左右子树 ...
- hdu5009 Paint Pearls[指针优化dp]
Paint Pearls Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- Java初学者笔记一:元类、获取类型、枚举
零.绪论: 2018年新年伊始,学习Java的冲动越来越强烈,毕竟以后无论是做安全开发还是安全研究都必不可少的掌握这门语言,所以在不断完善Python作为脚本语言的主语言的情况下觉得学习Java作为高 ...
- C# 文件夹的常用操作
C#获取文件夹下的所有文件的文件名 string path = @"E:\微课视频大于200M"; DirectoryInfo folder = new DirectoryInfo ...