带格式文件的T-SQL批量插入:格式不匹配时忽略行

时间:2015-12-30 11:15:24

标签: sql-server tsql

我正在尝试批量插入csv文件。 (所有Varchar字段)。

该文件包含以下行:

"10449";"135";"Programming";"2";"020";" ";"0";"4";"0";"4";"20151229";"20151228"

以特定行结束,以便检查我们是否导入了所有数据:

"DONE";"29/12/15";"12:15:03"

我已经使用bcp生成了一个非XML格式的文件,如下所示:

10.0
12
1       SQLCHAR             0       50      ";"      1     Budgetnr                               Latin1_General_CI_AS
2       SQLCHAR             0       50      ";"      2     CustID                                 Latin1_General_CI_AS
3       SQLCHAR             0       100     ";"      3     Subject                                Latin1_General_CI_AS
4       SQLCHAR             0       50      ";"      4     BNR2                                   Latin1_General_CI_AS
5       SQLCHAR             0       50      ";"      5     BNR3                                   Latin1_General_CI_AS
6       SQLCHAR             0       50      ";"      6     Type                                   Latin1_General_CI_AS
7       SQLCHAR             0       50      ";"      7     BudgetX                                Latin1_General_CI_AS
8       SQLCHAR             0       50      ";"      8     BudgetY                                Latin1_General_CI_AS
9       SQLCHAR             0       50      ";"      9     TimeSpentX                             Latin1_General_CI_AS
10      SQLCHAR             0       50      ";"      10    TimeSpentY                             Latin1_General_CI_AS
11      SQLCHAR             0       50      ";"      11    DateStrX                               Latin1_General_CI_AS
12      SQLCHAR             0       50      "\r\n"   12    DateStrY                               Latin1_General_CI_AS

使用批量插入with (FORMATFILE = 'C:\Temp\formatFile2.fmt', firstrow = 3, rows_per_batch = 5000 )

我收到以下错误:

  

批量加载:数据文件中遇到意外的文件结尾。

据我所知,这是因为批量插入需要更多列,但无法找到任何列。

如何告诉MsSQL忽略任何与格式不匹配的行? (我已经查看了其他选项,例如OPENROWSET来计算导入前的行数,但我不允许更改公司服务器上的安全设置,此外,这只是一个丑陋的解决方案做一些像这样简单的事情。)

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果您知道文件中的行数,则可以使用with (FORMATFILE = 'C:\Temp\formatFile2.fmt', firstrow = 3, BATCHSIZE = number_of_rows-3 )。否则,使用BATCHSIZE = 1将有助于避免您的错误,但每一行都将插入单独的事务中。它将破坏BULK INSERT的优势。