簡體   English   中英

CSV導入到SQL Server

[英]CSV import to SQL Server

我有一個具有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

我已經檢查了字段的名稱和數量,但是我看不到那里的問題,特別是它可以與其他文件完美配合

這是我將遵循的調試步驟。

  1. 我會高度懷疑數據文件本身。 您是否從記事本或NotePad ++中打開了CSV文件,以查看末尾是否有提取行? 我首先要看一下,然后將光標放在最后一條數據行的最后一個值上,然后按住Shift鍵,然后高亮顯示並刪除任何內容。

    1. 如果仍然導致更多行,則應再次檢查該文件。 這可能是由於CSV數據中文件中帶有逗號引起的。 文件文字是否合格? 含義是用雙引號引起來的數據。

    2. 前進的最佳方法是研究如何提取數據。 垃圾進垃圾出。 如果您的數據文件格式不正確,它將困擾您,並且始終是一個問題。

祝好運!

標准誤差在哪里? 在哪里,即從bcp.exe查找錯誤消息?

您正在執行的操作-使用動態SQL執行命令行實用程序以加載數據庫-簡直太糟糕了。 如果文件與服務器位於同一台機器上(或可通過文件服務器訪問),則可能需要調查BULK INSERT

面對錯誤,沒有使用bcp.exe會很可靠,也就是說,它對於批處理編程沒有用。 一方面,當行加載失敗時,它不會返回錯誤狀態,這意味着調用者在不解析標准錯誤輸出的情況下無法檢測到任何問題。 另外,根據錯誤的性質,行將被單獨刪除或成批刪除。

毫無疑問,在您的情況下,發生的情況是某些行不符合您的希望和期望,並且被bcp.exe(而不是服務器,它從未看到過)拒絕。 一個明顯的問題可能是帶引號的CSV字段"like, this" ,因為bcp.exe沒有引號的概念,它將被解釋為兩個字段。 被拒絕的行會詳細報告標准錯誤。 您面臨的挑戰是查找並檢測錯誤報告。

完成此操作后,您將看到CSV + BCP = fail 如果您完全控制CSV文件,那么我建議您不要使用普通英語散文(例如逗號)中出現的字符作為分隔符。 例如,使用標簽,因此沒有人認為您擁有一個CSV文件,其中包含所有復雜性。

如果您不控制輸入文件的格式,請不要使用bcp.exe加載它。 首先使用一種工具處理CSV文件,將其解釋為CSV語法的各種變化,然后生成一個嚴格由制表符或其他符號分隔的文件,而bcp.exe不會出錯。 然后加載。

如果你真的想鑽研吧, freetds的項目包括一個實用程序freebcp ,它返回一個錯誤狀態,可以批量可靠地使用。 最后我看了一下,但是,您必須先對其進行編譯。 它僅作為源代碼分發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM