【问题标题】:T-SQL Bulk Insert with format file: Ignore row upon format mismatch带有格式文件的 T-SQL 批量插入:格式不匹配时忽略行
【发布时间】:2015-12-30 11:15:23
【问题描述】:

我正在尝试批量插入 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,以便在导入之前计算行数,但我不允许更改公司服务器上的安全设置,此外,这只是做如此简单的事情的丑陋解决方案)。

提前致谢!

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

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

    【讨论】:

    • 感谢您的建议,但遗憾的是,行数每周都会改变,所以恐怕这不是一个选择:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2020-05-16
    • 1970-01-01
    相关资源
    最近更新 更多