zoukankan      html  css  js  c++  java
  • bulk insert 在mssql中使用

    从远程数据文件中批量导入

    若要使用 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;
  • 相关阅读:
    python文件处理-读、写
    Python三元运算和lambda表达式
    可变、不可变数据类型和hash
    Python常见字符编码间的转换
    Python常用字符编码
    spring cloud 使用spring cloud bus自动刷新配置
    spring cloud config--client
    spring cloud Config--server
    git 小乌龟安装教程
    spring cloud Eureka常见问题总结
  • 原文地址:https://www.cnblogs.com/Warmsunshine/p/7092944.html
Copyright © 2011-2022 走看看