【问题标题】:BCP SQL Server Invalid Date FormatBCP SQL Server 日期格式无效
【发布时间】:2018-05-19 00:40:03
【问题描述】:

我有大量数据要导入 Azure SQL 数据库。我要复制的表也有一个 smalldatetime 格式的时间戳字段,然后是另外 195 个浮点字段。我正在尝试将 csv 文件 BCP 到表中。 CSV 文件具有完全相同的格式。时间戳的格式相同,但我不断收到无效的日期格式错误。

数据库中的时间戳示例:

2017-11-05 12:00:00

来自 csv 文件的时间戳示例:

2017-11-27 00:16:37

我尝试过使用带有 -n 的 bcp 以及使用 -n 生成的格式文件和使用 -x 生成的格式文件。都给出了无效的日期格式错误。

bcp dbo.Meters format nul -n -S <URL> -d <databasename> -U <username> -P <password> -f format.fmt 

bcp dbo.Meters IN "output.csv" -S <URL> -d <databasename> -U <username> -P <password> -f format.fmt -t ,

我也尝试过使用 -c 选项,这给出了不同的错误:

Fractional second precision exceeds the scale specified in the parameter binding.

我在 google 上找不到很多与此相关的信息,但这似乎意味着 csv 文件中的时间戳中有几分之一秒超过了数据库表中 smalldatetime 格式的大小。 csv 文件中的所有时间戳都没有任何小数秒。

有谁知道为什么它认为日期格式不同?提前致谢!

CSV 文件样本可以下载here

不同字段名的创建表语句可以下载here

【问题讨论】:

  • 我建议您尝试找出问题所在。对只有 smalldatetime 字段的表和只有一个值的 csv 文件进行测试;测试是好是坏,然后从中进行调试。
  • 因此,使用测试表时,除了 -c 选项之外的所有内容都会出现 EOF 错误,该选项会给出“强制转换规范的字符值无效”错误,但仍会复制数据。 EOF 错误与行尾字符有关,但在上传到实际表时我没有收到此错误,并且测试和实际 csv 文件都以 CR LF 结尾。这有没有缩小范围?我不知道该怎么做。
  • 您正在使用 CSV,但尝试使用本机格式文件导入。这行不通。至少不是您编写代码的方式。导出 csv 格式文件而不是原生格式文件,然后重试
  • 看起来可能存在编码问题。您的 csv 文件的编码是什么?您的客户端操作系统是什么?您可以发布您尝试上传的 csv 文件的链接吗?
  • 我一直在使用格式文件,但我是否需要以不同的方式创建文件以与 csv 一起使用?我该怎么做?如果我使用制表符分隔的文本文件(我今天将对此进行试验),是否可以避免这些问题?不幸的是,我无法共享 csv 文件,因为其中包含机密数据。客户端操作系统为 Windows 10,csv 文件由 Excel 通过 VBscript 创建。编码是ANSI。我会用 UTF-8 试试。感谢您的建议!

标签: sql-server csv azure azure-sql-database bcp


【解决方案1】:

感谢 Nick.McDermaid 的解决方案:

我在数据库上创建了一个暂存表,其列名与目标表相同,但每个列类型都为 varchar。

然后 bcp 工作正常,使用字符选项 -c 上传到临时表。

bcp dbo.Staging IN "output.csv" -S <URL> -d <databasename> -U <username> -P <password> -c -t ,

那么它只需要以下 SQL 代码来更新实际表并从暂存表中删除数据。

INSERT INTO dbo.Meters
SELECT * FROM dbo.Staging
GO

DELETE FROM dbo.Staging
GO    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2010-12-14
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多