我有超过100个文件要导入到sql server中,其中大多数都是500 MB。我想利用SQL Server的并行导入实用程序,并阅读了许多网页,如下所示:
如何在30分钟内加载1 TB数据
https://technet.microsoft.com/en-us/library/dd537533(v=sql.100).aspx
与表级锁定并行导入数据
https://technet.microsoft.com/en-us/library/ms186341(v=sql.105).aspx
控制批量导入的锁定行为
https://technet.microsoft.com/en-us/library/ms180876(v=sql.105).aspx
和stackoverflow中的答案
Fastest way to insert in parallel to a single table
然而,他们都没有给出一个简单的代码示例。我知道如何使用批量插入/ bcp,但我不知道从哪里开始并行导入?任何人都可以帮我吗?
我的系统是Windows,我使用的是SQL Server 2016.源数据文件采用txt格式。
提前感谢您的帮助!
杰森
答案 0 :(得分:3)
将文件路径详细信息加载到跟踪表
创建表FileListCollection TABLE(Id int identity(1,1),filepath VARCHAR(500),ThreadNo tinyint,isLoaded int)
DECLARE @FileListCollection TABLE(filepath VARCHAR(500)) DECLARE @folderpath NVARCHAR(500) DECLARE @cmd NVARCHAR(100) SET @folderpath ='' SET @cmd =' dir' + @folderpath +' / b / s'
INSERT INTO @FileListCollection EXECUTE xp_cmdshell @cmd
DELETE FROM @FileListCollection WHERE filepath IS NULL
插入FileListCollection(filepath,isLoaded) 选择文件路径,0 来自@FileListCollection
每个帖子的时间表
声明@ThreadNo int = 3 更新f set ThreadNo =(id%@ ThreadNo) 来自FileListCollection f
打开三个会话并为每个
运行以下脚本加载数据
DECLARE @filepath NVARCHAR(500) DECLARE @filepath NVARCHAR(500) DECLARE @bcpquery NVARCHAR(MAX); DECLARE @ThreadNo int = 1 什么时候存在( 选择TOP 1 * FROM FileListCollection 其中ThreadNo = @ThreadNo 并且isLoaded = 0 ) 开始 SELECT TOP 1 @filepath = filepath FROM FileListCollection 其中ThreadNo = @ThreadNo 并且isLoaded = 0
SET @bcpquery = 'bulk insert <Database>.dbo.Table from '''+ @filepath+''' with (fieldterminator = ''|'', rowterminator = ''\n'')';
print @bcpquery
--Load the Content in table
execute sp_executesql @bcpquery;
Update FileListCollection set isLoaded = 1
WHERE filepath = @filepath
END