yxysuanfa
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!


分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-12-08
  • 2021-04-21
  • 2022-01-24
  • 2021-10-17
  • 2021-10-13
  • 2021-08-21
猜你喜欢
  • 2021-04-03
  • 2021-06-29
  • 2021-12-22
  • 2021-04-26
  • 2022-02-09
  • 2021-07-22
  • 2021-09-20
相关资源
相似解决方案