从OPENROWSET中选择(BULK ...)更改特殊字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从OPENROWSET中选择(BULK ...)更改特殊字符相关的知识,希望对你有一定的参考价值。

我已经面临一个问题几个小时了,我似乎无法理解这个问题。

所以我有一个SQL Server数据库2008R2,Collat​​ion SQL_Latin1_General_CP1_CI_AS。里面有一个表,名为incoming_name的字段。该字段的排序规则也是SQL_Latin1_General_CP1_CI_AS,它是一个NVARCHAR(255)。

我有一个大约123000行的.csv文件。这是一个基本的csv,文本周围没有双引号,但字段内没有逗号,所以当我运行手动导入到我的数据库时,它工作正常。 incoming_name字段包含所有类型的文本,但不得超过255个字符。在几行中有法语口音(如'Ch *â€teau d'Agassac')。

现在我尝试使用代码

select 
    test_file.[INCOMING_NAME] COLLATE SQL_Latin1_General_CP1_CI_AS
    as [INCOMING_NAME]
    , test_file.[PRODUCT_CODE] AS [PRODUCT_CODE]
FROM
                OPENROWSET(
                BULK 'INSERT PATH OF THE .CSV HERE',
                FORMATFILE = 'INSERT PATH OF THE FORMAT FILE HERE',
                FIRSTROW = 2
                ) AS test_file

使用格式文件

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RECORD>
        <FIELD ID="4" xsi:type="CharTerm" TERMINATOR=',' MAX_LENGTH="255" COLLATION="SQL_LATIN1_GENERAL_CP1_CI_AS" />
        <FIELD ID="29" xsi:type="CharTerm" TERMINATOR='
' />
    </RECORD>
    <ROW>
        <COLUMN SOURCE="4" NAME="INCOMING_NAME" xsi:type="SQLNVARCHAR"/>
        <COLUMN SOURCE="29" NAME="PRODUCT_CODE" xsi:type="SQLNVARCHAR"/>    
    </ROW>

导入工作正常,我得到我的所有数据,在正确的字段中使用正确的值,除了重音...

例如,当我在查询结束时添加where test_file.incoming_name like '%agassac%'时,我得到的结果就像'Château d'Agassac'而不是我数据库中的原始数据'Châteaud'Agassac'。

我不明白的是,我觉得在这个过程的每一步,我都选择了一个带有unicode数据类型(NVARCHAR)的口音敏感校对,所以我真的不明白为什么导入不会选择重音符号。

感谢您阅读这个长期的问题,

约翰。

编辑:好的,看起来我要导入的.csv文件是用utf-8编码的,而SQL Server 2008不想支持utf-8导入。现在我不知道该怎么做。欢迎任何想法......

答案

我认为添加widenative作为DATAFILETYPE应该解决问题。有关更多详细信息,请参阅此链接:http://msdn.microsoft.com/en-us/library/ms189941.aspx

以上是关于从OPENROWSET中选择(BULK ...)更改特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

SELECT FROM OPENROWSET(BULK...) 更改特殊字符

从 django bulk_create 中选择/查询对象?

用于 Synapse 专用池的 OPENROWSET()?

文件位置更改为远程共享时出现 BULK INSERT 错误

通过 Openrowset 和 Microsoft.ACE.OLEDB.12.0 从 csv 导入(到不同的列)

SQL 中的 OpenRowSet 命令返回 NULLS