我正在尝试将.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
有谁知道这里发生了什么?
谢谢!
答案 0 :(得分:8)
bcp 命令通常需要一个标识符来指定bcp文件的格式模式。
在您的测试用例中,您创建的文件是纯文本,因此您应在 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"错误或其他什么,但希望其他人能够扩展这一点。