将数据批量加载到使用 BCP 从 SQL Server 导出的 Snowflake 时出现 UTF-8 错误

Posted

技术标签:

【中文标题】将数据批量加载到使用 BCP 从 SQL Server 导出的 Snowflake 时出现 UTF-8 错误【英文标题】:UTF-8 error when bulk loading data into Snowflake that was exported from SQL Server using BCP 【发布时间】:2019-10-09 15:41:30 【问题描述】:

我有一个 CSV 文件,我通过使用大容量复制实用程序 (bcp.exe) 导出 SQL Server 2016 SP2 中的表来创建。我将代码页设置为 65001(Microsoft's documentation 状态为 UTF-8)。但是,当我在雪花中逐阶段文件然后尝试使用复制命令将它移动到表中时,我收到一个错误,即表示,“在字符串中检测到无效的UTF8”0xFF0xFE00X0000X000000X0010X00M0X00C0X00A0X00A0X00M0x00'。“

如果我使用 IGNORE_UTF8_ERRORS 标志,我会在我的表中获得难以理解的数据。我们将不胜感激地收到有关如何解决此问题的任何建议。

这是我的 BCP 电话:

BCP "SELECT Id, Name FROM database_name.owner_name.table_name WHERE Id = '0011602001r4ddgAZA'" queryout C:\temp\test.csv "-t|" -w -T -S. -C 65001

这是 Snowflake 中的代码:

--Create a file format
create or replace file format SFCI_Account
  type = 'CSV'
  field_delimiter = '|'
  validate_utf8 = True
 ;

-- Create a Stage object
create or replace stage SFCI_Account_stage
file_format = SFCI_Account;

-- Check my file is there  
list @SFCI_Account_stage;

-- Copy the file into the table
copy into Test
from @SFCI_Account_stage
file_format = (format_name = SFCI_Account)
pattern='.*.csv.gz'
on_error = 'skip_file';

【问题讨论】:

【参考方案1】:

显然,我需要做的就是在我的 BCP 调用中将 -w 更改为 -c 并添加以下内容:

-r "\r\n"

所以,我的最终 BCP 调用如下所示:

BCP "SELECT Id, Name FROM database_name.owner_name.table_name WHERE Id = '0011602001r4ddgAZA'" queryout C:\temp\test.csv "-t|" -c -T -S. -C 65001 -r "\r\n"

现在,解决了 UTF-8 错误的问题,但现在我必须弄清楚如何处理数据中的回车。

【讨论】:

如果只是utf-8字符串不能引用字符串,是否应该让CVS导入接受回车? (这就是我为我们的 postgress 转储所做的) 嗨西蒙。如果您能告诉我一种在 634 列的表上实现这一目标的简单方法,我将很乐意尝试。 对于我的 postgress 数据库,我使用了\Copy (select * as diag from TABLE_NAME) to 'file_name.csv' WITH csv delimiter ',' FORCE QUOTE diag escape '\\' FORCE QUOTE,但我不确定 SQL Server 语法 我尝试引用字符字段,但事实证明我嵌入了引号(双引号和单引号)以及嵌入的管道字符(我的字段分隔符)、回车符(我的行分隔符)和退格键。我必须非常有创意,但最终设法在所有这些前面放置了一个反斜杠,以扮演 Snowflake 的转义角色。

以上是关于将数据批量加载到使用 BCP 从 SQL Server 导出的 Snowflake 时出现 UTF-8 错误的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver的BCP导入导出

如何删除双引号并跳过 bcp 加载到 SQL Server 中的最后 3 行?

使用重新分发的组件导出 SQL Server 数据

SQL Server通过BCP进行大批量数据导入导出

在SQL Server中,如何快速删除大批量数据和进行大批量数据导入?

SQL Server批量数据导出导入Bulk Insert使用