SSIS处理导入数据时, 存在的更新, 不存在的插入

转载 2012年01月07日 17:35:33

问题描述:

当你把数据从其他数据库或者是文本文件之类的其他数据源导入到目的数据库时有时希望在导入的处理中能够实现"数据存在时更新不存在时导入"

在之前一般是通过导入临时表然后再判断处理导入正式表的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 拖到表达式框中。

Ø       单击确定关闭表达式生成器对话框。

Ø       再次单击确定关闭属性表达式编辑器对话框。

相关文章推荐

SSIS处理导入数据时, 存在的更新, 不存在的插入

问题描述:当你把数据从其他数据库, 或者是文本文件之类的其他数据源导入到目的数据库时, 有时希望在导入的处理中, 能够实现"数据存在时更新, 不存在时导入"在之前, 一般是通过导入临时表, 然后再判断...

SSIS处理导入数据时, 存在的更新, 不存在的插入

转载地址:http://www.cnblogs.com/lhuser/articles/1454427.html   SSIS处理导入数据时, 存在的更新, 不存在的插入 问题描...

SSIS处理导入数据时, 存在的更新, 不存在的插入

问题描述 当你把数据从其他数据库, 或者是文本文件之类的其他数据源导入到目的数据库时, 有时希望在导入的处理中, 能够实现"数据存在时更新, 不存在时导入" 在之前, 一般是通过导入临时表...

关于MongoDB中如何做到对已有数据插入时更新字段,不存在时则插入新的Document

背景需求: * 比如我们有这样一个需求,有两个excel中的数据,需要插入到数据库中,这个两个excel中的数据有些字段都是一样的,比如本例所写的,电台名称是一样的,省市县也是一样的,而不一样的是波...

oracle imp导入数据 表空间不存在 处理

D:\oracle_home\product\10.2.0\db_1\BIN>imp portal/portal@192.168.28.203/WANGMEI file=temp88.dmp igno...

MySQL插入数据时,如果记录不存在则insert,如果存在则update

MySQL 当记录不存在时insert,当记录存在时更新 网上基本有三种解决方法。 第一种: 示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使...

mysql处理存在则更新,不存在则插入(多列唯一索引)

mysql处理某个唯一索引时存在则更新,不存在则插入的情况应该是很常见的,网上也有很多类似的文章,我今天就讲讲当这个唯一的索引是多列唯一索引时可能会遇到的问题和方法。 方法一: 使用 INSERT...

MySQL 当记录不存在时插入,当记录存在时更新

MySQL 当记录不存在时插入,当记录存在时更新 网上基本有三种解决方法。 第一种: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients...

MySQL 当记录不存在时插入,当记录存在时更新

第一种: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERTINTOclients (client_id,client_na...

如何实现插入时如果不存在则插入如果存在则更新的操作(分别用oracle、MySQL和SQL Server实现)

一:oracle的实现方法(利用merge into) Oracle在9i引入了merge命令, 通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)