10

我正在尝试将大量数据从 .csv 文件转储到 SQL Server 2012 数据库中。我正在调查bcp.

编辑:这是一个自动化过程,而不仅仅是一次性的。我也BULK INSERT无权访问此数据库。

当我尝试将数据复制到数据库中时,bcp不会返回任何错误,但实际上也不会复制任何内容 - 它只是返回0 rows copied. 我已将其缩减为一个不起作用的最小案例。

首先,创建一个包含两列的简单表:

CREATE TABLE [dbo].[mincase](
    [key] [varchar](36) NOT NULL,
    [number] [int] NOT NULL

    PRIMARY KEY CLUSTERED 
    (
        [key] ASC
    )
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 40) ON [PRIMARY]
) ON [PRIMARY]

GO

然后,用于bcp从中创建格式文件。请注意,此示例创建了一个 XML 格式文件,但它是 XML 还是本机无关紧要。

bcp MyDB.dbo.mincase format nul -T -n -f mincasexml.fmt -x -S .\SQLEXPRESS

现在创建一个 data.csv 文件,其中包含一行和两个条目,以制表符分隔。就我而言,该文件很简单:

somecharacters  12345

同样,这是一个制表符,而不是两个空格,并且是否有尾随换行符似乎并不重要。

现在尝试使用bcp该格式文件来插入该文件中的数据:

bcp MyDB.dbo.mincase in data.csv -f mincasexml.fmt -T -S .\SQLEXPRESS

我没有将数据复制到数据库,而是得到以下信息:

Starting copy...

0 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 1

有谁知道这里发生了什么?

谢谢!

4

2 回答 2

9

bcp命令通常需要一个标识符来指定 bcp 文件的格式模式。

  • -c 指定字符(明文)模式
  • -n 指定本机模式
  • -w 指定 unicode 模式

在您的测试用例中,您创建的文件是纯文本文件,因此您应该在bcp in 命令中指定“-c”。

bcp MyDB.dbo.mincase in data.csv -c -T -S .\SQLEXPRESS

Microsoft 建议对导入和导出使用“-n”以避免列值中出现字段分隔符的问题(请参阅字符模式和本机模式最佳实践部分)。

于 2013-04-30T22:51:51.123 回答
4

我遇到了类似的问题,除了我已经在使用格式文件,所以添加格式标志之一无济于事。对于最终来到这里的其他任何人,我想为我解释导致此问题的原因(并希望有助于解释根本问题的原因是什么)。

问题是 BCP 实际上并不处理文件中的文本行。相反,它只是根据您给它的指令处理数据流。这意味着如果您(不小心)告诉 BCP 这样做,则将忽略换行符。

就我而言,这原来是格式文件最后一行的错字:

13.0
1348
1 SQLCHAR 0 21 "," 1 RecordKey ""
2 SQLCHAR 0 30 "," 0 SubmissionKey ""
3 SQLCHAR 0 1 "," 2 A1cLvl ""
...
1347 SQLCHAR 0 1 "," 0 WoundIntVac ""
1348 SQLCHAR 0 1 "/r/n" 0 XClampTm ""

如果您仔细观察,您会发现斜线在最后一行的终止符字段中是向后的。因此,BCP 不是在寻找 Windows 风格的行尾,而是在数据流中寻找文本字符串“/r/n”。

由于该字符串实际上根本没有出现在我的数据中,因此 BCP 从未真正找到与我的最终字段匹配的任何内容。因此,它找到要复制的“0 行”是有道理的。

我仍然不确定为什么这不会导致“遇到意外的 EOF”错误或其他东西,但希望其他人能够对此进行扩展。

于 2016-02-11T22:44:30.170 回答