SQL Server高速导入数据分享

SQL Server高速导入数据,能够尝试的方法例如以下:CTE、OpenRowSet/OpenDataSource、BULK INSERT、bcp、Shell。

以下依次介绍这几种办法。

1.CTE

首先。我们看看什么是CTE。

公用表表达式(Common Table Expression)是SQL SERVER 2005版本号之后引入的一个特性。

CTE能够看作是一个暂时的结果集,能够在接下来的一个SELECT,INSERT,UPDATE,DELETE,MERGE语句中被多次引用。使用公用表达式能够让语句更加清晰简练。

CTE 与派生表相似,详细表如今不存储为对象,而且仅仅在查询期间有效。与派生表的不同之处在于。CTE 可自引用,还可在同一查询中引用多次。
很多其它请点击:http://technet.microsoft.com/zh-cn/library/ms190766(v=sql.105).aspx

示比例如以下:

USE AdventureWorks2008R2;
GO
-- Define the CTE expression name and column list.
WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)
AS
-- Define the CTE query.
(
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
    INTO #temp1
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID IS NOT NULL
)
-- Define the outer query referencing the CTE name.
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear
INTO #temp2
FROM Sales_CTE
GROUP BY SalesYear, SalesPersonID
ORDER BY SalesPersonID, SalesYear;
GO

2.OpenRowSet/OpenDataSource

OpenRowSet和OpenDataSource都能够訪问远程的数据库,但详细表现上,二者还是有区别的。OpenDataSource 不使用链接的server名,而提供特殊的连接信息,并将其作为四部分对象名的一部分。 而OpenRowSet 包括訪问 OLE DB 数据源中的远程数据所需的所有连接信息。

当訪问链接server中的表时,这样的方法是一种替代方法,而且是一种使用 OLE DB 连接并訪问远程数据的一次性的、特殊的方法。能够在查询的 FROM 子句中像引用表那样引用 OpenRowSet 函数。根据 OLE DB 提供程序的能力。还能够将 而OpenRowSet 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。虽然查询可能返回多个结果集,然而OPENROWSET 仅仅返回第一个。很多其它请点击:http://technet.microsoft.com/en-us/library/ms179856.aspx

示比例如以下:

--启用Ad Hoc Distributed Queries
EXEC SP_CONFIGURE ‘show advanced options‘,1
RECONFIGURE
EXEC SP_CONFIGURE ‘Ad Hoc Distributed Queries‘,1
RECONFIGURE
--使用OpenDataSource导入数据
INSERT INTO IMP_DATA.dbo.t_goods
SELECT *
FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.12.0‘,
‘Data Source="E:/Report1.txt";User ID=Admin;Password=;Extended properties=Excel 12.0‘)...[Sheet1$]
--使用完成后,切记关闭它。由于这是一个安全隐患
EXEC SP_CONFIGURE ‘Ad Hoc Distributed Queries‘,0
RECONFIGURE
EXEC SP_CONFIGURE  ‘show advanced options‘,0
RECONFIGURE 

3.BULK INSERT

BULK INSERT同意用户以其指定的格式将数据文件导入到数据库表或视图中。很多其它请点击:http://msdn.microsoft.com/zh-cn/library/ms188365.aspx

示比例如以下:

--定义导入目的和导入源
BULK INSERT IMP_DATA.dbo.t_goods FROM ‘E:/Report1.txt‘
WITH (
  --列分隔符
  FIELDTERMINATOR = ‘,‘,
  --行分隔符
  ROWTERMINATOR = ‘\n‘
)

4.bcp

bcp 有用工具能够在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据。 使用 bcp 有用工具能够将大量新行导入 SQL Server 表。或将表数据导出到数据文件。 除非与 queryout 选项一起使用,否则使用该有用工具不须要了解 Transact-SQL 知识。 若要将数据导入表中,必须使用为该表创建的格式文件,或者必须了解表的结构以及对于该表中的列有效的数据类型。

很多其它请点击:http://msdn.microsoft.com/zh-cn/library/ms162802.aspx

示比例如以下:

--打开高级选项
EXEC SP_CONFIGURE ‘show advanced options‘, 1;
RECONFIGURE;
--启用运行CMD命令
EXEC SP_CONFIGURE ‘xp_cmdshell‘, 1;
RECONFIGURE;

--指定导入目的和导入源
EXEC master..xp_cmdshell ‘BCP IMP_DATA.dbo.t_goods in E:\report.txt -c -T‘

5.Shell

Shell通过拼接插入字符串的方法非常灵活,而且出错较少。但插入的内容包括非常多非法字符的话会非常恼。

能够參考曾经写的文章:缺乏导入数据权限,SQL Server创建測试数据

最后,贴张前段时间做的图。导入数据总结:


Good Luck!

时间: 2024-11-03 22:15:12

SQL Server高速导入数据分享的相关文章

将Excel导入SQL Server 只能导入数字,其他数据变为NULL怎么解决?

先新建一个TXT文件,把数据粘贴进去 再新建一个Excel文件,在菜单栏中选Data再选From Text 找到txt文件,点import 一定要选Text 点Finish,点OK. 接下来在往数据库中导入 打开SQL Server Management Studio 在需要导入数据的数据库名上点击鼠标右键选Task,选Import Date 点Next Data Soure选Microsoft Excel file path选你的Excel文件 点Next Authentication中选Us

SQL Server如何导入mdf,ldf文件(转载)

这篇文章写的很好,很好用~谢谢博客分享 在平时开发中,经常会遇到数据库SQL Server如导入mdf,ldf文件的问题,下面给你介绍一下怎么做,希望能够帮到你. 工具/原料 SQL Server mdf,ldf文件 方法/步骤一:代码方法 1 打开SQL Server,可以选择Windows方式连接. 2 打开数据库,右键某一个数据库,选择“新建查询(Q)”. 3 再代码界面输入如下代码,点击F5键或者点击运行按钮即可. 代码如下: EXEC  sp_attach_db  @dbname  =

Sql Server随机抽取数据效率优化

Sql Server随机抽取数据效率优化2013-05-11 1 个评论 作者:菜光收藏 我要投稿Sql Server随机抽取数据效率优化 山人我最近遇到一件很纠结的事情,就是如何快速的从数据表里随机抽取一条数据. 我生成了一个简单的数据表,并且导入了500W条数据进行测试. 下图为第一次采用的SQL语句: Declare @d DatetimeSet @d=getdate()SELECT top 1[ActivityID] ,[CardNo] ,[Password] ,[State] ,[Cr

[SQL Server]内存缓存数据写入磁盘(一)首部曲

很少扎实的实践SQL Server Database Engine内部的行为,最近发现某个客户的性能瓶颈可能在Transaction log的I/O,同时另外一家客户正在导入保存厂商异地备援(DR site)的解决方案(不打算用AlwaysOn传送到异地),由于保护的是磁盘资源,我们需要确保磁盘上的mdf.ndf与ldf的一致性. 来笔记Buffer Flush To Disk读书心得以及SQL2012/2014/SQL2016相关的新古与全新功能. 维持ACID的完整性(Atomicity)及

一个有趣的SQL Server 层级汇总数据问题

看SQL Server大V宋大侠的博客文章,发现了一个有趣的sql server层级汇总数据问题. 具体的问题如下: parent_id emp_id emp_name total_amout     NULL 2 Andrew 200     2 1 Nancy 100     2 3 Janet 120     3 4 Michael 80     1 5 Robert 50     每个员工的总销售额=自己的销售额+其下级员工的总销售额,     比如:     Andrew = 200_

SQL Server :理解数据记录结构

在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下. 数据记录存储我们具体的数据,换句话说,它存在堆表里,或者存在聚集索引的叶子节点.数据记录结构是为了让SQL Server更高效的管理数据.我们来看下数据记录结构示意图: 上图中蓝色部分是所有数据记录部分,绿色部分是表结构里取决于定长/变长列的数据记录部分. 行头系统数据: 用做状态位1的第1字节(8位)是用来定义记录的属性: 第0位:版本信息

SQL Server 批量插入数据的两种方法

在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters). 运行下面的脚本,建立测试数据库和表值参数. [c-sharp] view plaincopy --Create DataBase create database BulkTestDB; go use BulkTes

根据SQL Server中的数据向矢量图层中添加点对象

SQL Server中的数据已有坐标信息(LAT,LNG) 在FormLoad事件中从SQL里获取数据并存储在DataSet. //在顶部定义SqlConnection对象 // public static string conStr = "server=(local);database=DbName;uid=sa;pwd=123"; //public SqlConnection conn = new SqlConnection(conStr); conn.Open();//打开数据库

SQL Server插入中文数据后出现乱码

原文:SQL Server插入中文数据后出现乱码 今天在做项目的过程中遇到如标题的问题,情况如下图: 数据库使用的是SQL Server2012版本,创建表的脚本如下: CREATE TABLE [dbo].[Type](  [TypeId] INT NOT NULL PRIMARY KEY,     [TypeName] NVARCHAR(50)NOT NULL,     [Description] NVARCHAR(255) NULL,     [CategoryId] INT NOT NU