批量插入时出现额外字符

4

我正在尝试将csv文件中的第一行批量插入到只有一个列的表格中。 但是我在开头会得到一些额外的字符('n++'),就像这样:

n++First Column;Second Column;Third Column;Fourth Column;Fifth Columnm;Sixth Column

CSV文件的内容如下:

First Column;Second Column;Third Column;Fourth Column;Fifth Columnm;Sixth Column

您可以在此处找到test.csv文件。

以下是我正在使用的代码,用于获取表格中的第一行数据:

declare @importSQL nvarchar(2000)
declare @tempstr varchar(max)
declare @path varchar(100)  

SET @path = 'D:\test.csv'    

CREATE TABLE #tbl (line VARCHAR(max))

SET @importSQL = 
'BULK INSERT #tbl 
FROM ''' + @path + ''' 
WITH ( 
LASTROW = 1,
FIELDTERMINATOR = ''\n'',
ROWTERMINATOR = ''\n''
)' 

EXEC sp_executesql @stmt=@importSQL 

SET @tempstr = (SELECT TOP 1 RTRIM(REPLACE(Line, CHAR(9), ';')) FROM #tbl)

print @tempstr
drop table #tbl

有任何想法,这个额外的'n++'是从哪里来的?

我不认为TRIM存在。它存在吗? - Mohammad Nadeem
5个回答

4

似乎没有像codepage = '65001'这样的东西,因为msdn的代码页列表中没有针对sql server 2005的内容。请参见http://msdn.microsoft.com/en-us/library/ms186356(SQL.90).aspx - Mohammad Nadeem
我已向Microsoft反馈了此问题。让我们看看他们有什么要说的。https://connect.microsoft.com/SQLServer/feedback/details/631379/bulk-insert-reading-addional-text-byte-order-mark-of-the-file-from-csv-file-in-sql-server-2005#tabs - Mohammad Nadeem

4

额外的字符是由编码引起的。您可以使用记事本将编码格式从UTF-8更改为Unicode。这将删除第一行上的'n++'。


3

尝试了DATAFILETYPE = 'char'和DATAFILETYPE = 'widechar',但没有帮助。 - Mohammad Nadeem
我也尝试了CODEPAGE ='RAW'和n ++现在变成了ï» ¿,这是UTF-8的BOM。但我仍然无法解决这个问题。 - Mohammad Nadeem
1
纳迪姆,你能否使用十六进制查看器获取文件的字节顺序标记? - Philip Fourie
看起来这是UTF-8文件的BOM。请尝试使用DATAFILETYPE ='char'和CODEPAGE ='65001',看看是否适用于您? - Philip Fourie
1
尝试将数据类型更改为NVARCHAR。 - MikeAinOz
显示剩余2条评论

1

不幸的是,旧版的SQL Server不支持utf-8。请在批量插入方法中添加codepage参数。请在您的问题中更改代码如下。

SET @importSQL = 
'BULK INSERT #tbl 
    FROM ''' + @path + ''' 
    WITH ( LASTROW = 1, 
           FIELDTERMINATOR = ''\n'', 
           ROWTERMINATOR = ''\n'' , 
           CODEPAGE=''65001'')'

请注意,您的文件必须以utf-8格式保存。 但问题在于,如果您将服务器从2005升级到2008,则代码页65001(utf-8)不受支持,然后您将收到“代码页不受支持”的消息。

这个在SQL 2012中有没有办法使用? - Cid

0
在SQL Server的后续版本中,您可以在命令中添加“-C 65001”来指示使用utf-8编码。这将删除第一行中的n++。其中C是大写字母。当然,在键入命令时不要包括引号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接