【问题标题】:How to specify length prefix in bcp command?如何在 bcp 命令中指定长度前缀?
【发布时间】:2019-09-15 18:23:39
【问题描述】:

我正在使用 bcp 工具将 CSV 导入到 sql server 表中。我正在使用 python 子进程来执行 bcp 命令。我的示例 bcp 命令如下所示:

bcp someDatabase.dbo.sometable IN myData.csv -n -t , -r \n -S mysqlserver.com -U myusername -P 'mypassword'

命令执行并说

0 rows copied.

即使我删除 -t 或 -n 选项,消息仍然相同。我从 sql server 文档中读到有一个叫做长度前缀的东西(如果 bcp 工具与 -n(本机)模式一起使用)。

如何使用 bcp 命令指定长度前缀?

我的目标是使用 bcp 工具将 CSV 导入 sql server 表。我首先根据我在 CSV 文件中的日期创建我的表,我没有为 bcp 创建格式文件。我希望正确插入所有数据(根据我在表中指定的数据类型)。

【问题讨论】:

    标签: python sql sql-server bulkinsert bcp


    【解决方案1】:

    如果是 csv 文件,则不要使用 -n、-t 或 -r 选项。使用 -e errorFileName 来捕获您可能遇到的错误。然后,您可以采取适当的步骤。

    【讨论】:

    • 省略 -n 启动 bcp 的交互模式 - 询问我不想要的每个字段的类型和长度。因为我正在使用 python 做事
    • @HarisMuzaffar 你有一个 csv 文件,所以使用 -c 选项。
    • 在将 csv 导入 sql 表时会抛出错误 - 因为我的表包含日期、int 等数据类型的混合
    • @HarisMuzaffar csv 文件具有可读的字符数据,记录中的每个字段用逗号分隔。使用 -c 和 -e errorFileName 选项。所有的错误都会记录在errorFileName文件中。
    【解决方案2】:

    ETL 任务的一种非常常见的做法是首先将文本文件加载到具有所有 varchar/char 数据类型的“加载”表中。这避免了任何可能的隐含数据转换错误,这些错误通过 BCP 进行故障排除更加困难/耗时。只需将文本文件中的字符数据传递到 SQL Server 中的字符数据类型列。然后,您可以将数据从“加载”表移动到最终目标表中。这将允许您使用功能更多的 T-SQL 命令来处理数据类型的转换。不要强制 BCP/SQL Server 通过 BCP 从文本文件直接转换到最终表格,从而为您转换数据类型。

    另外,我还建议您目视检查您传入的数据文件,以确认其格式符合指定。我经常看到 \n 和 \r\n 之间的行终止符混淆。

    最后,在加载数据时,您还应该使用 -e 选项,如 Neeraj 所述。这将捕获“数据”错误(它不报告命令/语法错误;仅报告数据/格式错误)。由于您传入的文件是一个 ascii 文本文件,因此您确实希望使用 -c 选项加载到全 varchar“加载”表中。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 2016-03-07
      • 2021-08-06
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多