在SQL Server中使用CSV文件进行BULK INSERT

use*_*945 1 sql sql-server csv

我有一个.CSV包含10000行的文件.需要将这些行插入/更新到SQL Server数据库表中.

可能存在这样的情况:数据库中可能存在几行,这意味着需要更新那些行并在日志文件中触发.如果数据库中不存在,则需要插入.

一种可能的解决方案是,我可以逐行读取,检查数据库中的条目并相应地构建插入/更新查询.但是,此过程可能需要很长时间来创建更新/插入查询并在数据库中执行它们.有时我的CSV文件可能有数百万条记录.

有没有其他更快的方法来实现此功能?

下面是我试图实现的代码.在这篇文章中,我将使用BULK INSERT语句进行批量导入.我们使用both BULK INSERTMERGE语句作为此实现,不仅用于插入记录,还用于更新记录(如果已存在).

BULK INSERT tablename
FROM 'D:\xmlData\Trialbalelce.txt' --This is CSV file
WITH ( FIELDTERMINATOR =',',rowterminator = '\n',FIRSTROW = 1 )
Run Code Online (Sandbox Code Playgroud)

Vin*_*nie 11

好的,希望这一切都有帮助.我把您在评论中发布的内容转换为存储过程.方案是您有一个具有一致格式的平面文件,您每次都会加载到同一个表(dbo.custCompInfo_Tab).该表将合并到dbo.Daily_Sync匹配的最终目标()中CompanyName.我添加了一些数据列来进一步说明合并.

建立:

CREATE TABLE dbo.Daily_Sync
    (CompanyName VARCHAR(10)
   , UserId INT
   , col1 INT
   , col2 INT
   , col3 INT
    )

CREATE TABLE dbo.custCompInfo_Tab
    (CompanyName VARCHAR(10)
   , col1 INT
   , col2 INT
   , col3 INT
    )
Run Code Online (Sandbox Code Playgroud)

我有两个要加载的数据文件,TrialBalance.txt和TrialBalance2.txt.它们包含以下数据:

TrialBalance.txt

abc,1,2,3
def,4,5,6
qwe,7,8,9
asd,10,11,12
zxc,13,14,15

TrialBalance2.txt

abc,1,2,3
def,20,21,22
qwe,7,8,9
xcv,10,11,12
xbv,13,14,15
Run Code Online (Sandbox Code Playgroud)

我创建了一个截断登台表的存储过程,使用传入的文件路径中的数据加载表,然后将其合并到目标中.

CREATE PROCEDURE dbo.loadDailyData
    @FullFilePath NVARCHAR(MAX)
AS 
    BEGIN
        DECLARE @sql NVARCHAR(MAX)  
    TRUNCATE TABLE dbo.custCompInfo_Tab

    SET @sql = N'BULK INSERT dbo.custCompInfo_Tab FROM ''' + @FullFilePath
        + ''' WITH ( FIELDTERMINATOR ='','',ROWTERMINATOR = ''\n'',FIRSTROW = 1 )'

    SELECT  @sql

    EXEC sp_executesql @sql

    MERGE INTO dbo.Daily_Sync AS TGT
        USING 
            (SELECT CompanyName
                  , USER_ID() usrid
                  , col1
                  , col2
                  , col3
             FROM   dbo.custCompInfo_Tab
            ) AS SRC
        ON TGT.Companyname = SRC.CompanyName
        WHEN MATCHED 
            THEN UPDATE
                SET     TGT.Companyname = SRC.companyname
                      , TGT.col1 = SRC.col1
                      , TGT.col2 = SRC.col2
                      , TGT.col3 = SRC.col3
        WHEN NOT MATCHED 
            THEN INSERT (companyname
                       , UserId
                       , col1
                       , col2
                       , col3
                        )
                VALUES  (SRC.CompanyName
                       , SRC.usrid
                       , SRC.col1
                       , SRC.col2
                       , SRC.col3
                        ); 

END
Run Code Online (Sandbox Code Playgroud)

这里有动态sql用于构建字符串而不是rowcounts,BULK INSERT字符串是返回的全部内容.

最后,我们可以看到之前和之后的表格:

SELECT  *
FROM    dbo.custCompInfo_Tab
SELECT  *
FROM    dbo.Daily_Sync

EXEC dbo.loadDailyData @FullFilePath = 'D:\xmlData\TrialBalance.txt'


SELECT  *
FROM    dbo.custCompInfo_Tab
SELECT  *
FROM    dbo.Daily_Sync

EXEC dbo.loadDailyData @FullFilePath = 'D:\xmlData\TrialBalance2.txt'


SELECT  *
FROM    dbo.custCompInfo_Tab
SELECT  *
FROM    dbo.Daily_Sync
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

  • 看起来你在这个答案中投入了大量的精力.它值得更多的选票! (2认同)