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

问题描述 投票:2回答:1

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

所以我有一个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='\r\n' />
    </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导入。现在我不知道该怎么做。欢迎任何想法......

sql-server sql-server-2008 bulkinsert collation openrowset
1个回答
0
投票

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