【关于数据大容量的导入导出小结】

                                           关于数据大容量的导入导出小结

 

 

/*----------------------------------------------------------------

-- Author  :feixianxxx(poofly)

-- Date    :2010-03-29 14:04:14

-- Version:

--      Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 

Jul  9 2008 14:43:34 

Copyright (c) 1988-2008 Microsoft Corporation

Enterprise Evaluation Edition on Windows NT 6.1 <X86> (Build 7600: )

----------------------------------------------------------------*/

 

1。关于大容量数据导入导出的一些方法

SQL SERVER提供多种工具用于各种数据源的数据导入导出这些数据源包括本文文件ODBC数据源OLE DB数据源ASCII文本文件和EXCEL电子表格

 

2.常用工具

DTS:数据转换服务导入导出向导或者DTS设计器创建DTS包

使用SQL SERVER复制发布数据

BCP命令提示实用工具实现SQL SERVER实例和数据文件之间的数据导入导出

BULK INSERT实现从数据文件导入数据到SQL SERVER实例

分布式查询实现从一个数据源选择数据插入到SQL SERVER实例

SELECT INTO 语句插入数据表

 

 

3.导入导出的数据

1。导入数据的目标表必须存在导出数据的目标文件如果存在则将重写上面的内容如果不存在则BCP自动创建文件

2。数据文件中的数据必须是字符格式或是先前由bcp工具生成的格式(本机格式)

3。必须对相应的表拥有足够的权限

4。数据导入导出工具的简单用法

 

 

4.数据导入导出工具的简单用法

a.DTS

DTS是一组图形工具和可编程对象是开发者可以将取自完全的不同源的数据析取转换并合并成一个或者多个

它的特点就是可以融合完全不同源的数据源 这在企业改进中应用很大 。

这里涉及到一个DTS包它是一个有组织的链接DTS任务DTS转换和工作流约束的集合

关于DTS的操作请参看相关具体文献

 

b.BCP

它常用于将大量的数据从另外的程序转移到SQL SERVER表中当然也可以用于将表中数据传输到数据文件中

下面是一些BCP的简单用法(关于很多的选项使用看相关文档)  

--前序,开启xp_cmdshell 

--关于xp_cmdshell的一些知识请看http://blog.csdn.net/feixianxxx/archive/2009/08/14/4445603.aspx

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;

EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

--环境

create table test

(

id int,

value varchar(100)

)

go

insert test values(1,'s1')

insert test values(2,'s2')

insert test values(3,'s3')

insert test values(4,'s4')

go

--1将表的数据导出到TEXT.txt文件中

exec master..xp_cmdshell 'bcp tempdb.dbo.test out e:/test.txt -c  -Usa -P123456'

--如果是WINDOWS身份直接xec master..xp_cmdshell 'bcp tempdb.dbo.test out e:/test.txt -T -c'

--2TEXT.txt文件中的数据复制到test1

select * into test1 from test where 1=2

exec master..xp_cmdshell 'bcp tempdb.dbo.test1 in e:/test.txt -c  -Usa -P123456'

select * from test1

--3TEST表的ID字段复制到TEXT.txt

exec master..xp_cmdshell 'bcp "SELECT id FROM tempdb.dbo.test" queryout e:/test.dat -T -c'

--4test表中的第一行移动到text.txt

exec master..xp_cmdshell 'bcp "SELECT top 1 * from tempdb.dbo.test "  queryout e:/test.txt -c  -Usa -P123456'

--关闭xp_cmdshell

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;

EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;

 

c.BULK INSERT 

它只能用于数据导入到SQL SERVER实例中但是我们一般会选择使用它因为它比BCP使用工具快

小例子

--truncate table test

BULK INSERT tempdb..test

   FROM 'E:/test.txt'

   WITH 

      (

         FIELDTERMINATOR =',',--字段分割符号

         ROWTERMINATOR ='/n'--换行符号

      )

select * from test 

/*

id          value

----------- -----------

1            s1

2            asds

3            sadsa

100          2asda*/

ps只写最简单用法,具体参数很多参考MSDN

 

d.分布式查询

--包含访问OLE DB 数据源中的远程数据所需的全部连接信息。

--当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用OLE DB 连接并访问远程数据的一次性的临时方法。

--对于较频繁引用OLE DB 数据源的情况,请改为使用链接服务器。

--A.OPENROWSET SELECT SQL Server Native Client OLE DB 访问接口一起使用(MSDN

以下示例使用 SQL Server Native Client OLE DB 访问接口访问 TEST.A 该表位于远程服务器 SERVER1 上的 POOFLY 数据库中.

SELECT a.*

FROM OPENROWSET('SQLNCLI', 'Server=SERVER1;Trusted_Connection=yes;',

     'SELECT GroupName, Name, DepartmentID

      FROM POOFLY.TEST.A

      ORDER BY GroupName, Name') AS a;

--B. 使用Microsoft OLE DB Provider for JetMSDN

以下示例通过 Microsoft OLE DB Provider for Jet 访问 Microsoft Access Northwind 数据库中的 Customers 

SELECT CustomerID, CompanyName

   FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',

      'C:/Program Files/Microsoft Office/OFFICE11/SAMPLES/Northwind.mdb';

      'admin';'',Customers)

GO

--c.使用OPENROWSET 将文件数据大容量插入varchar(max) 列中

/*

为了导入大型对象数据,OPENROWSET BULK 子句支持三个选项,允许用户以单行或单列行集导入数据文件的内容。

你可以指定其中一个大型对象选项,而不是使用格式化文件。

大型对象选项包括:

SINGLE_BLOB 

以单行读取data_file 的内容,以varbinary(max) 类型的单列行集返回内容。

SINGLE_CLOB 

以字符读取指定数据文件的内容,以varchar(max) 类型的单行、单列行集返回内容,使用的是当前数据库的排序规则,例如文本或Microsoft Word 文档。

SINGLE_NCLOB 

Unicode 读取指定数据文件的内容,以nvarchar(max) 类型的单行、单列行集返回内容,并使用当前数据库的排序规则。

*/

以下示例创建一个用于演示的小型表并将名为 Text1.txt 的文件中的文件数据插入 varchar(max) 列中

CREATE TABLE my_Test(Document varchar(max))

GO

INSERT INTO  my_Test 

 select * FROM OPENROWSET(BULK N'E:/test.txt', SINGLE_CLOB) AS Document

GO

select * from my_Test

/*

Document

-------------------------------------------------------   

ASDSADASDSADSADSAFKJHFAS HKLASJHASHBKDSAHKJDHSAKJDHSAKDHSAKDHSA

*/

 

e.SELECT INTO

关于这个的用法 相信大家都很清楚了 我就不说明了

 

 

5。优化导入导出数据的一些方法

1使用最小日志记录:

a.恢复模式是简单模式或者大容量日志记录模式如果你是完整模式可以在进行操作前改成大容量日志模式插入后改回来

b.目的表没有触发器,没有索引,指定了TABLOCK

 

2将数据从多个客户端并行导入到单个表:

a.如果是完整恢复模式改成大容量日志模式

b.指定了TABLOCK

c.表上没有索引

 

3使用批处理:通过设置BCP或者BULK INSERT的相关选项是用于可以指定在操作过程中发给SQL的每个批处理的行数

 

4禁用触发器和约束:默认情况下是禁用的如果要检查可以在复制完成后进行一次更新操作(当然值不可以变) 

 

5对数据文件中的数据排序:通过设置ORDER提示,提高性能默认数据文件是不排序的

 

6控制锁定行为:指定大容量操作过程获得一个大容量更新表级锁这样可以减少表上锁的争夺

 

7回避DEFAULT:通过设置相关选项,回避在复制数据到表中时对有DEFAULT的列插入默认值而是改成在列中值为NULL

 

 

  • 0
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值