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

Posted

技术标签:

【中文标题】SELECT FROM OPENROWSET(BULK...) 更改特殊字符【英文标题】:SELECT FROM OPENROWSET( BULK...) changing special characters 【发布时间】:2013-07-21 15:24:30 【问题描述】:

几个小时以来我一直面临一个问题,但我似乎无法理解这个问题。

所以我有一个 SQL Server 数据库 2008R2,排序规则 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âteau d'Agassac”。

我不明白的是,我觉得在流程的每一步,我都选择了一个区分重音的排序规则,使用 unicode 数据类型 (NVARCHAR),所以我真的不明白为什么导入不选择口音。

感谢您阅读这么长的问题,

约翰。

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

【问题讨论】:

您是否尝试设置codepage 【参考方案1】:

我认为将 widenative 添加为 DATAFILETYPE 应该可以解决问题。详情请参考此链接:http://msdn.microsoft.com/en-us/library/ms189941.aspx

【讨论】:

您好索南,感谢您的回答。问题是,我尝试添加 DataFileType = 'widenative',但看起来它只允许使用 BULK INSERT TableName FROM 'csv path' WITH (options...) 语法或 bcp 命令。我将尝试更改我的代码以使用 BULK INSERT FROM 而不是 OPENROWSET。

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

调用 OPENROWSET 时 INSERT INTO 和 SELECT INTO 的区别

SQL 调用存储过程

SQL Server和Access数据读写

Sql Server 跨服务器连接

将txt文档导入数据表时

用openrowset函数操作远程数据库