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...) 更改特殊字符的主要内容,如果未能解决你的问题,请参考以下文章