BCP不返回任何错误,但也不复制任何行

时间:2013-04-30 22:12:59

标签: sql sql-server bcp

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

,而不是做成千上万的INSERT

编辑:这是针对自动流程的,而不仅仅是一次性的。我对此数据库也没有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

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

谢谢!

2 个答案:

答案 0 :(得分:8)

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

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

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

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

Microsoft Recommends使用'-n'进行导入和导出,以避免出现在列值中出现字段分隔符的问题(请参阅字符模式和纯模式最佳实践部分)。

答案 1 :(得分:2)

我遇到了类似的问题,除了我已经在使用格式文件,所以添加一个格式标志是没有用的。对于最终到此为止的其他人,我想解释一下导致这个问题的原因(并希望有助于解释潜在问题​​的原因)。

问题是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"错误或其他什么,但希望其他人能够扩展这一点。