2013-07-22 83 views
2

我一直在面对一个问题几个小时,而且我似乎无法摆脱这个问题。从OPENROWSET(BULK ...)中进行选择更改特殊字符

所以我有一个SQL Server数据库2008 R2,排序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导入。现在我不知道该怎么做。任何想法的欢迎...

+0

您是否尝试设置'codepage'? –

回答

0

我认为增加扩大DATAFILETYPE应该解决这个问题。请参阅此链接了解更多详情:http://msdn.microsoft.com/en-us/library/ms189941.aspx

+0

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