CSV导入到SQL Server

时间:2018-12-05 19:22:08

标签: sql sql-server csv

我有一个具有29,471行的CSV文件(shrlgpa.csv)。但是,当我将其导入到SQL Server时,输出显示复制了29,482行。为什么会这样?

这是我使用的脚本,该脚本对所有其他csv文件都适用:

USE master
GO
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE WITH OVERRIDE
GO

USE [VCC_BE_SQL_stg]
GO

DECLARE @cmd varchar(8000)
= CONCAT( '"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\bcp.exe"'
    , ' VCC_BE_SQL_stg.VCC.{tbl} in C:\VCCBanner\{tbl}.csv'
    , ' -a 65535 -b 10000 -c -F 2 -U mssql_stg -P password2012 -S'
    , ' WIN-8I8OQB38II4\SQLEXPRESS2012 -t 0x7C -r 0x0A -E'
    )

DECLARE @tables TABLE ( tbl varchar(255) PRIMARY KEY )
INSERT INTO @tables VALUES ('shrlgpa');

DECLARE @tbl varchar(255) = ( SELECT MIN(tbl) FROM @tables )
DECLARE @nth int = 0
DECLARE @cnt int = ( SELECT COUNT(1) FROM @tables )
DECLARE @sql varchar(255)= N'TRUNCATE TABLE VCC_BE_SQL_stg.VCC.'
DECLARE @run nvarchar(255)
WHILE ( @nth <> (@cnt) )
BEGIN
        SET @tbl = (
            SELECT tbl
            FROM @tables
            ORDER BY tbl
            OFFSET @nth ROWS
            FETCH NEXT 1 ROWS ONLY
        )
        --SET @SQL = (SELECT N'TRUNCATE TABLE VCC_BE_SQL_stg.VCC.' + @tbl)
        SET @run = ( SELECT @sql + @tbl )
        select @run
        EXEC sp_executesql @run
        SET @run = ( SELECT REPLACE( @cmd, '{tbl}', @tbl) )
        select @run
        EXEC xp_cmdshell @run
        SET @nth = @nth + 1
END

我已经检查了字段的名称和数量,但是我看不到有什么问题,特别是它可以与其他文件完美配合

2 个答案:

答案 0 :(得分:0)

这是我要遵循的调试步骤。

  1. 我对数据文件本身非常怀疑。有你吗 从记事本或NotePad ++打开CSV,以查看是否有 最后提取行?我先去那看,把你的 将光标放在最后一条数据行的最后一个值上并按住 Shift键,然后高亮显示并删除所有内容。

    1. 如果仍然导致更多行,则应再次检查该文件。这可能是由于CSV数据中文件中带有逗号引起的。文件文字是否合格?含义是用双引号引起来的数据。

    2. 最好的前进方式是研究如何提取数据。垃圾进垃圾出。如果您的数据文件格式不正确,它将困扰您,并且始终是一个问题。

祝你好运!

答案 1 :(得分:0)

标准错误在哪里?在哪里,即从bcp.exe查找错误消息?

您正在做的事情-使用动态SQL执行命令行实用程序来加载数据库-简直太糟糕了。如果文件与服务器位于同一台计算机上(或可通过文件服务器访问),则可能需要查看BULK INSERT

面对错误,没有使用bcp.exe会很可靠,也就是说,它对于批处理编程没有用。一方面,当行加载失败时,它不会返回错误状态,这意味着调用者在不解析标准错误输出的情况下无法检测到任何问题。另外,根据错误的性质,行将被单独删除或成批删除。

毫无疑问,在您的情况下,发生的情况是某些行不符合您的希望和期望,并且被bcp.exe(而不是服务器,从未见过的服务器)拒绝。一个明显的问题可能是带引号的CSV字段"like, this",因为bcp.exe没有引号的概念,它将被解释为两个字段。被拒绝的行会详细报告标准错误。您面临的挑战是查找并检测错误报告。

执行完该操作后,您会发现 CSV + BCP =失败。如果您对CSV文件具有绝对控制,那么我建议您不要使用普通英语散文(例如逗号)中出现的字符作为分隔符。例如,使用标签,因此没有人认为您拥有一个CSV文件,其中包含所有复杂性。

如果您不控制输入文件的格式,请不要使用bcp.exe加载它。首先使用一种工具处理CSV文件,将其解释为CSV语法的各种变化,然后生成一个严格由制表符或其他符号分隔的文件,而bcp.exe则不会出错。然后加载。

如果您真的想深入研究它,FreeTDS项目将包含实用程序freebcp,该实用程序确实会返回错误状态并且可以可靠地批量使用。最后我看了一下,但是,您必须先对其进行编译。它仅作为源代码分发。