2010-12-14 35 views
4

Je tente d'insérer en bloc la première ligne d'un fichier CSV dans une table contenant une seule colonne. Mais je reçois des caractères supplémentaires ('n ++') dans le début comme celui-ci:Des caractères supplémentaires sont générés lors de l'insertion en bloc

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

contenu du fichier CSV sont comme:

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

Vous pouvez trouver le fichier test.csv here

Et voici le code que je utilise pour obtenir les premières données de ligne dans une table

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 @[email protected] 

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

print @tempstr 
drop table #tbl 

Une idée d'où vient ce 'n ++'?

+0

prefer trim() over rtrim ( – Pratik

+0

Je ne pense pas que TRIM existe. Le fait? –

Répondre

3

Ce sont peut-être les Unicode Byte Order Mark qui sont en cours de collecte.

Je vous suggère de définir l'option DATAFILETYPE dans votre déclaration. Voir la documentation MSDN pour plus de détails: http://msdn.microsoft.com/en-us/library/aa173832%28SQL.80%29.aspx

+0

Essayé DATAFILETYPE = 'char' et DATAFILETYPE = 'widechar'. Mais n'a pas aidé. –

+0

J'ai aussi essayé CODEPAGE = 'RAW' et n + + maintenant changé en '' ï '' qui est la nomenclature pour UTF-8. Mais je ne suis toujours pas capable de résoudre le problème. –

+1

Nadeem pouvez-vous peut-être obtenir la marque de commande d'octets en utilisant une visionneuse hexadécimale sur votre fichier? –

4

Il semble que les fichiers UTF-8 ne sont pas supportés par SQL Server 2005 et 2008, ils ne seront disponibles que dans la version 11!

https://connect.microsoft.com/SQLServer/feedback/details/370419/bulk-insert-and-bcp-does-not-recognize-codepage-65001

+0

On dirait qu'il n'y a rien de tel que codepage = '65001' car msdn liste de pages de code ne l'a pas pour sql server 2005. Voir http://msdn.microsoft.com/fr-fr /library/ms186356(SQL.90).aspx –

+0

J'ai signalé ce problème à Microsoft Feedback. Voyons voir ce qu'ils ont à dire. 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 –

4

Les charectors supplémentaires sont causés par le codage. Vous pouvez utiliser le bloc-notes utilisé pour modifier le format de codage de UTF-8 à Unicode. Cela a supprimé le 'n ++' sur la première rangée.

1

Malheureusement, les anciennes versions de SQL Server ne prennent pas en charge utf-8. Ajoutez le paramètre codepage à la méthode d'insertion en bloc. Dans votre question s'il vous plaît changer votre code tel qu'il existe.

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

Notez que votre fichier doit être au format utf-8. Mais le problème est que, si vous mettez à niveau votre serveur de 2005 à 2008, la page de codes 65001 (utf-8) n'est pas supportée et vous obtiendrez le message "page non supportée"

+0

Existe-t-il un moyen de l'utiliser dans SQL 2012? – Cid

+0

Oui, vous pouvez le faire –