从远程数据文件中批量导入
若要使用 BULK INSERT 从其他计算机中大容量导入数据,必须在两台计算机之间共享数据文件。 指定共享数据文件时,请使用它的通用命名约定 (UNC) 名称,其一般形式为 \服务器名共享名路径文件名。 此外,用来访问该数据文件的帐户必须具有读取远程磁盘上的文件所需的权限。
首先 共享远程服务器文件夹 并设置为所有权
以下附上代码:
BULK INSERT tabletest
FROM 'D:\20170629.txt'
WITH(
FIRSTROW=1,
FIELDTERMINATOR = ',', --使用“,”作为列分隔符
ROWTERMINATOR = '
', --使用“
”作为行分隔符
KEEPNULLS , --如果有些Column没有值,设置 KEEPNULLS 选项,表示将该column设置为NULL
check_constraints
)
SELECT * FROM tabletest
附上存储过程的实现:
procedure [dbo].[loadData]
(@p_pathname varchar(1200)) as begin set nocount off; declare @filename varchar(1200) declare @stsql nvarchar(max)if (@p_pathname='' or @p_pathname is null) return; set @filename=@p_pathname; set @stsql='BULK INSERT tabletest ' +' FROM '''+@filename+'''' +' WITH(' +' FIRSTROW=1,' +' FIELDTERMINATOR = '','','--使用“,”作为列分隔符 +' ROWTERMINATOR = '' '','--使用“ ”作为行分隔符 +' KEEPNULLS , ' --如果有些Column没有值,设置 KEEPNULLS 选项,表示将该column设置为NULL +' check_constraints' +' )'; /* print(@stsql); */ exec sp_executesql @statemnet=@stsql; set nocount on; end;
下面是执行远程服务器网络上的文件
BULK INSERT table_test FROM '\远程服务器名\共享文件files\20170727.txt' WITH( KEEPIDENTITY, FIRSTROW=1, FIELDTERMINATOR = ',', --使用“,”作为列分隔符 ROWTERMINATOR = ' ', --使用“ ”作为行分隔符 KEEPNULLS , --如果有些Column没有值,设置 KEEPNULLS 选项,表示将该column设置为NULL check_constraints )
存储过程实现 传递文件路径的方法以及给服务器共享文件路径赋值
procedure [dbo].[loadData] (@p_pathname varchar(1200)) as begin set nocount off; declare @filename varchar(1200) declare @stsql nvarchar(max)if (@p_pathname='' or @p_pathname is null) return;
--如果是远程网络服务器上的文件就采用此路径传值和赋值 赋予共享的远程服务器上的文件路径
-- 程序文件部署在那一台服务器就要用那一台的名称
--去掉前两位路径D: 传值路径D:\20170629.txt
set @filename='\远程文件服务器名+SUBSTRING(@p_pathname,3,len(@p_pathname)-2); set @stsql='BULK INSERT tabletest ' +' FROM '''+@filename+'''' +' WITH(' +' FIRSTROW=1,' +' FIELDTERMINATOR = '','','--使用“,”作为列分隔符 +' ROWTERMINATOR = '' '','--使用“ ”作为行分隔符 +' KEEPNULLS , ' --如果有些Column没有值,设置 KEEPNULLS 选项,表示将该column设置为NULL +' check_constraints' +' )'; /* print(@stsql); */ exec sp_executesql @statemnet=@stsql; set nocount on; end;
完整的 导数据流程存储实现
procedure [dbo].[dataload] ( @p_pathname varchar(1200) ) as begin set nocount off; declare @filename varchar(1200) declare @stsql nvarchar(max) declare @stsqlinsert nvarchar(max) declare @stsqlDeleteTmp nvarchar(max) declare @params nvarchar(max) declare @stsqlReplace nvarchar(max) if (@p_pathname='' or @p_pathname is null) return; ------------------------------------------------------------------------------------------------------ --如果是本地就采用此路径传值 D:\files\pay_cfm\db_0301_20170727.txt --set @filename=@p_pathname; ----------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------ --如果是远程网络服务器上的文件就采用此路径传值和赋值 赋予共享的远程服务器上的文件路径 --\P-2017072U\szrpp_files\pay_cfm\db_0301_20170727.txt 程序文件部署在那一台服务器就要用那一台的名称 --select substring('D:\files\pay_cfm\db_0201_20170721.txt',3,len('D:\files\pay_cfm\db_0201_20170721.txt')-2) --去掉前两位路径\P-2017072Uszrpp_files set @filename='\WIN-VMCOI88888'+SUBSTRING(@p_pathname,3,len(@p_pathname)-2); --------------------------------------------------------------------------------------- --第一先导入 set @stsql='BULK INSERT CfmRcdTmp ' +' FROM '''+@filename+'''' +' WITH(' +' FIRSTROW=1,' +' FIELDTERMINATOR = '','','--使用“,”作为列分隔符 +' ROWTERMINATOR = '' '','--使用“ ”作为行分隔符 +' KEEPNULLS , ' --如果有些Column没有值,设置 KEEPNULLS 选项,表示将该column设置为NULL +' check_constraints' +' )'; --print(@stsql); --print(@stsqlinsert); --第二再存入实际库 set @stsqlinsert='insert into CfmRcd( ReconSource , CmfFile , CfmDate , FileNumCur , RechargeSerial , TradeSysWater , TradeTime , TradeFee , CfmStatus ) SELECT ReconSource , CmfFile , CfmDate , FileNumCur , RechargeSerial , TradeSysWater , TradeTime , TradeFee , CfmStatus FROM CfmRcdTmp'; --第三进行清除临时表 SET @stsqlDeleteTmp='truncate table CfmRcdTmp'; --第四再替换格式 set @stsqlReplace=' update CfmRcd set reconsource=replace(reconsource,'''''''',''''), cmffile =replace(cmffile,'''''''',''''), cfmdate=replace(cfmdate,'''''''',''''), filenumcur=replace(filenumcur,'''''''',''''), rechargeserial =replace(rechargeserial,'''''''',''''), TradeSysWater=replace(TradeSysWater,'''''''',''''), tradetime=replace(tradetime,'''''''',''''), tradefee =replace(tradefee,'''''''',''''), cfmstatus=replace(cfmstatus,'''''''','''') '; exec sp_executesql @statemnet=@stsql; exec sp_executesql @statinsert=@stsqlinsert; exec sp_executesql @stattruncate=@stsqlDeleteTmp; exec sp_executesql @statReplace=@stsqlReplace; set nocount on; end;