Bulk Insérer un file avec un champ de text avec return chariot (Entrée)

J'ai du mal à insert en bloc un file contenant un champ dans le type de données text, et il contient entre et le délimiteur pour les champs sont des tuyaux "|" et la terminaison de ligne est "| \ n"

J'obtiens une erreur de troncature pour les champs à côté du champ de text. Je pense que l'insert en vrac pense que les inputs dans le second champ sont les rangées suivantes.

DECLARE @sql varchar(2000) PRINT 'xyz table' SET @sql = 'BULK INSERT xyz FROM ''\\' + @@servername + '\Import\xyz.txt'' WITH ( DATAFILETYPE = ''char'', FIELDTERMINATOR = ''|'', ROWTERMINATOR = ''|\n'', TABLOCK, ROWS_PER_BATCH = 2000, MAXERRORS = 1000 ) ' PRINT @sql EXECUTE (@sql) PRINT '' GO 

C'est l'exemple de données

 467507**|**08-20-09\ [8:55:03 AM] *** miked@wkaiser-6793 is Not Available [Ext. away]\(CR) [9:00:57 AM] *** miked@wkaiser-6793 is Online [Online]\(CR) [9:01:00 AM] <jeffp> Howdy. Time slip update game! Update TS#467493 & 467507 with a (CR)comment and see if you win! [9:01:30 AM] *** miked@wkaiser-6793 is Away [Away]\ \(CR) 08-18-09\(CR) [10:13:15 AM] *** miked@wkaiser-6793 is Online [Online]\(CR) [10:13:59 AM] <jeffp> Howdy; welcome back from lunch.. Just pinging you for an update in TS#467493 & 467507. Since 467493 is pri9, want a stock e-mail to go out to the customer to get them moving?\(CR) [10:14:47 AM] <miked@wkaiser-6793> thats ok i got it\(CR) [10:14:53 AM] <jeffp> Aiight.**|**2009-08-18 00:00:00**|**2009-08-20 00:00:00**|**JDP**|**JDP**|** 

Le schéma de la table est:

 create table xyz ( xyz_id VARCHAR(200), --INT TO VARCHAR notes text, create_date varchar(32), --DATETIME create_user varchar(12), modify_date varchar(32), --DATETIME modify_user varchar(12) ) 

Comme vous pouvez le voir (bien, ne peut pas voir) il y a entre (marqué avec CR) et l'encart en vrac les confond avec une nouvelle ligne.

Toute aide serait appréciée.

Merci

EDIT: vous n'avez pas besoin d'un file de format:

 IF OBJECT_ID('tempdb..#rawdata') IS NOT NULL DROP TABLE #rawdata create table #rawdata ( xyz_id VARCHAR(200) , notes text , create_date varchar(32) , modify_date varchar(32) , create_user varchar(12) , modify_user varchar(12) ) BULK INSERT #rawdata FROM 'C:\temp\file.txt' WITH ( FIELDTERMINATOR = '**|**' , ROWTERMINATOR = '**|**\n' , TABLOCK ) SELECT * FROM #rawdata 

Vous devrez peut-être jouer avec **|**\n (LF) vs **|**\r\n (CRLF) vs **|**\r (CR), selon que le file est Unix, DOS ou MAC-like.

/MODIFIER

Cela ne peut pas être fait sans un file de format. Donc, créez un file de format:

 8.0 7 1 SQLCHAR 0 0 "**|**" 1 xyz_id "" 2 SQLCHAR 0 0 "**|**" 2 notes "" 3 SQLCHAR 0 0 "**|**" 3 create_date "" 4 SQLCHAR 0 0 "**|**" 4 modify_date "" 5 SQLCHAR 0 0 "**|**" 5 create_user "" 6 SQLCHAR 0 0 "**|**" 6 modify_user "" 7 SQLCHAR 0 0 "\n" 0 omitted "" 

Alors:

 IF OBJECT_ID('tempdb..#rawdata') IS NOT NULL DROP TABLE #rawdata create table #rawdata ( xyz_id VARCHAR(200) , notes text , create_date varchar(32) , modify_date varchar(32) , create_user varchar(12) , modify_user varchar(12) ) BULK INSERT #rawdata FROM '\\folder\file.txt' WITH ( FORMATFILE = '\\folder\file.fmt' , TABLOCK ) 

Ou, dans SQL 2005+:

 SELECT * FROM OPENROWSET( BULK '\\folder\file.txt' , FORMATFILE = '\\folder\file.fmt' ) a 

Les données sont incohérentes. Vous avez quelques lignes terminant \(cr) avec un champ, l'autre (cr) termine par | séparateurs de colonne

Soit cela ou vous avez des séparateurs de colonnes incohérents, certains \(cr) , certains | . Si c'est le cas, vous aurez besoin d'un file de format pour traiter chaque "colonne" séparée.