如何用把Oracle中的数据插入到sqlserver中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用把Oracle中的数据插入到sqlserver中?相关的知识,希望对你有一定的参考价值。

当前数据库为oracle 10g,还有另外一套系统是sqlserver,现在要把oracle这边系统执行的时候将数据传到sqlserver中,我通过dblink连接到sqlserver,但是只能查询,用insert into 插入不到sqlserver的表中,请问哪位大虾知道怎么处理,给个处理办法?

--用dts移植数据

--数据转换服务(Data Transformation Services,简称dts),它可以在任意数据源之间移动数据,并在移动过程中对数据进行清洗
--dts通常用于将数据移动到sql Server,但实际上它可以方便地在几乎所有的数据源之间移动数据

--注意:“复制数据库向导”和“导入/导出向导”实际只是创建和执行了dts包

--dts设计器
--“数据转换服务”->“本地包”->新建或打开包
--“连接”:可用的连接对象
--“任务”:包含了19个关键的数据转换任务,其中最常见的是“转换数据任务”和“执行sql任务”
--“包属性”:在dts的设计器中选择“包”->“属性”或右键“包属性”,可以打开包属性对话框

--添加“连接”

--添加“任务”
--1、源:源可以是源连接中的一个表、视图,或者一个sql查询
--2、目的:接收数据的表
--3、转换:对源数据列和目的数据列进行匹配或者连接。一个列转换可以是下列情形之一:
--复制列是转换中最常见的情况
--日期时间字符串、小写字符串、字串、裁剪字符串和大写串的处理全都与复制列转换类似,不同的是
--它们中的每一个都增加了某种类型的数据转换功能
--读文件和写文件分别用于将数据导入或者导出到源列中所指定的文件
--对于包含有逻辑或者数据查找的复杂转换,需要使用ActiveX脚本实现
--4、查找:仅仅把数据从一个表移动到另外一个表是一项很简单的任务。但在很多情况下我们都必须在转换的过程中对数据进行修改
--转换任务可以调用查找脚本找出需要的值来替换源数据集中的值
--a、定义一个查找,“名称”:需要替换的源数据中的列名;“连接”:目的驱动;“高速缓存”:设置dts执行时可以缓存的查询结果数量
--b、“查询”:可以打开查询设计器的一个变种,通过它可以为任意的连接定义有效的查询。该查询应当以源列表中的值为输入(参数),
--并返回相应的替代它的值以便插入目的表。输入的参数用‘?’来表示,而select语句所返回的值就是用于在目的表中替代输入参数的值
--下面的例子从源列中读出顾客类型的名字,并用查询所返回的CustomerTypeID来替代它
select customertypeid from customertype where (name = ?)
--为什么要这样做呢?源表中的customertype列为字符,而目的表中的customertypeid为整型,所以需要根据源表中的customertype(字符)
--从表customertype中得到相应的customertypeid以便插入到目的表的customertypeid(整数)中
--c、Active转换?
/*'**********************************************************************
' Visual Basic Transformation Script
'************************************************************************

' Copy each source column to the destination column
Function Main()
dtsDestination("CustomerTypeID") = dtsLookups("CustomerType").Execute(dtsSource("CustomerType"))
Main = dtsTransformStat_OK
end Function
*/
--5、转换选项:

--工作流控制
--dts只包含几个任务的情况在实际中是很少见的。绝大多数dts包都要执行数十个任务,而这些任务之间又具有错综复杂的关系。因此,执行
--顺序对于防止错误的发生至关重要。
--dts通过以下选项来控制工作流的执行顺序:完成时(蓝色);成功时(绿色);失败时(红色)
--如:添加任务“执行sql任务”(用来执行sql语句),以在执行其他任务之前删除表中的数据。则此任务为第一个执行。选中此任务和第二个
--任务,然后从“工作流”中选择需要工作流类型(如完成),就可以设定这两个任务之间的执行顺序。执行好之后作用:先执行第一个任务,
--完成后,再执行第二个任务。。
--如果要为转换数据任务设置工作流,可以选择该转换任务的源连接,右键->“工作流属性”->设置工作流

--执行dts包

--存储和移动dts包
--1、“包”->“保存”:保存到本地服务器上。展开企业管理器控制台树的“数据转换服务”->“本地包”,将会看到那些保存的包
--2、“包”->“另存为”:提供了其他几种可选的存储格式和选项
--sql Server:这种方法将包保存在任何已注册的sql Server的MSDB数据库的sysdtspackages表中。如果已经注册了相应的服务器,
--这将是最简单的把包移动到另外一个sql Server上的办法。如果要把包移动到还没有注册的服务器上,应使用“结构花存储文件”选项
--Meta Data Services:这种高级的方法可以跟踪已经为DTS修改的数据
--结构化存储文件:这种方法能够创建可以复制到另外一个sql Server,并且可以在另外一台服务器上打开的文件。一定要注意sql Server
--和service pack的版本号,因为具有不同的service pack级别的SQL Server 2000实例所使用的结构化存储文件有可能是不兼容的
--要打开用结构化存储文件格式保存的包,可以在企业管理器控制台树的数据转服务节点的快捷方式菜单中选择“打开包”菜单命令
--Visual Basic文件:这个选项可以生成与SQL Server DTS包完成同样任务的vb脚本
--注意:如果已经使用“包”->“另存为”命令保存了包,“包”->“保存”命令将用上一个“另存为”命令所选择的位置和格式来保存这个包

--增量和版本
--数据转换服务还有一个很好的特性:它能够对包的变化进行管理。包的每次保存都会产生该包的一个新版本,最终就会形成该包的多个连续的版本
--如果要查看任意包所保存的各个版本,可以在企业管理器中,从本地包清单中选择一个DTS包,然后选择“操作”->“版本”菜单命令,或者从
--该包的快捷方式菜单中选择“版本”菜单。此时将会打开“DTS包版本”对话框,并显示该包的各个版本的日期和描述
--使用“DTS包版本”对话框,可以打开以前的版本进行编辑或者对它们进行清理。如果想恢复到某个以前的版本,可以打开该版本进行编辑,然后】
--使用“包”->“另存为”菜单命令以一个新名字保存该包
参考技术A 可以将数据以XML格式传到SQL Server的机器上,再插入表中. 参考技术B 用sql server的数据导入导出功能就可以了。 参考技术C 1、右键点击sqlserver中的数据库,选择“任务”——再选“导入数据”;

2、“下一步”——数据源选择oracle *** OLE DB;

3、点“属性”,属性“连接”选项卡上的数据源填写你的oracle sid。并把用户名密码天上,选择“允许保存密码”。测试连接——连接成功;

4、“下一步”——保持默认点“下一步”——选择你想要的方式 再“下一步”——在列出的oracle表中选择你要导入的表(需要做映射就做映射,因为oracle的数据类型跟sqlserver的还是有所不同),然后下一步。接着就一路点下一步,就完成了。

Excel如何用函数或公式将原始数据表中的数据分类同步到新的工作表中?是不是可以用filter函数解决?

excel电子表格中,是否可以用filter这个函数解决:如图所示,图中有四个表,一个总表,总表里有三大类(肉类,蔬菜,蛋类),需要把这三大类的所有数据全部同步到对应的三个分表中,可以添加任何条件,也可以在工作表中插入列,插入条件,请问大神该怎么操作?在此先谢过大神。

在 Excel 2007 中,可以用以下公式满足题述要求(类表同步总表数据):
1. 肉类:=IFERROR(IF(INDEX(Sheet1!$C$1:$F$99,SMALL(IF(Sheet1!$B$1:$B$99="肉类",ROW($1:$99),4^8),ROW(A1)),COLUMN(A1))="","",INDEX(Sheet1!$C$1:$F$11,SMALL(IF(Sheet1!$B$1:$B$99="肉类",ROW($1:$99),4^8),ROW(A1)),COLUMN(A1))),"")
2. 蔬菜:将公式中的“肉类”换成“蔬菜”
3. 蛋类:将公式中的“肉类”换成“蛋类”

注1:该公式为数组公式,须“Ctrl+Shift+Enter”三键同按结束输入|
注2:为简洁起见,三张类表合在一张表内
注3:为便于验证,在总表中引入了类表

公式的结果如下图示:

总表及同表中的类表公式结果的图示

类表中公式结果的图示

追问

看起来好复杂,麻烦大神帮忙看一下能不能用filter这个函数解决?

追答

我用的是 Excel 2007 ,低版本 Excel 没有 Filter 函数,所以只能用笨办法。
如果用 Filter 函数,的确简单很多(以“肉类”为例):
1. 本表:=FILTER(C2:G11,C2:G11="肉类") (在本表内 H2 单元格输入公式)
2. 类表:=FILTER(Sheet1!C2:G11,Sheet1!C2:G11="肉类") (在类表内 A2 单元格输入公式)

注:上述公式仅供参考,因为没有经过验证。

参考技术A 根据你的要求,推荐两个比较好的方法:
方法一:多重合并计算的数据透视表,因为你说了只有3个工作表要合并,那么用多重合并计算的数据透视表简单方便。按
Alt+D+P
调出多重合并计算区域对话框,选择“多重合并计算区域”,进入下一步,默认单字段不要动,直接下一步,然后分别选择3个要汇总的工作表的数据区域(根据你所说的要插入列或行等情况,最好是选择把3工作表的数据区域定义为动态名称或直接转换为超级表),添加到下面的列表中,3个工作表的数据区域(或定义的3个名称)添加后,下一步选择透视表的放置的工作表,选择“现在工作表”,再选择“汇总”,如果没有先插入的“汇总”工作表,就直接“新工作表”(事后修改为“汇总”)。会自动生成数据透视表,根据需要,重新拖动组合,达到自己满意的透视效果。
如果3个工作表定义了动态名称或转换成了超级表,数据有变化时,只要刷新透视表即可。如果没有,就要上一步,上一步,直到选择数据源对话框,添加选择数据源修改。
方法二:Power Qurey,特别适合于多个工作表的合并汇总(当然2或3个也很方便)
获取数据——从工作簿,选择要合并的工作簿,筛选去掉“汇总”工作表,然后在Power Qurey中,用分组依据进行合并计算。最后上载回“汇总”工作表中。
Power Qurey无需对数据源工作表定义名称,数据有变化时,只要刷新,会自动按最新的数据进行刷新。且工作簿中增加了新的工作表(与原有的工作表要有完全相同的结构,否则会出错)或删除了工作表时,都能通过刷新更新。
更推荐方法二,虽然并不难,但对于初学者,可能要稍多练习才能掌握,而方法一几乎只要按照步骤来就能掌握。
祝你成功。
PS:公式的方法当然也是可以的,但对于本问题,比起上面介绍的方法,差的不是一点点。所以不做介绍了。

以上是关于如何用把Oracle中的数据插入到sqlserver中?的主要内容,如果未能解决你的问题,请参考以下文章

如何用python批量插入数据到mysql数据库,用list

如何用kettle插入oracle数据库的含有CLOB类型

如何用Java实现把excel表中的数据导入到mysql数据库已有的表中?

Oracle中 如何用一个表的数据更新另一个表中的数据

如何用sql向数据库中插入包含特殊字符的字

Oracle中如何用一条insert into 语句插入多条数据 如: insert into 表 values(多条数据)????????