2009-10-29 12 views
1

J'ai du mal à insérer un fichier contenant un champ dans un texte de type de données, et il contient des entrées et le délimiteur pour les champs sont des tubes "| " et la terminaison de ligne est "| \ n"Bulk Insérer un fichier avec un champ de texte avec retour chariot (Entrée)

Je reçois une erreur de troncature pour les champs à côté du champ de texte. Je pense que l'insert en vrac pense que les entrées 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 

Ce sont les données exemple

467507**|**08-20-09\ 
[8:55:03 AM] *** [email protected] is Not Available [Ext. away]\(CR) 
[9:00:57 AM] *** [email protected] 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] *** [email protected] is Away [Away]\ 
\(CR) 
08-18-09\(CR) 
[10:13:15 AM] *** [email protected] 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] <[email protected]> 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 dans (marqué avec CR) et l'encart en vrac les confond avec une nouvelle rangée.

Toute aide sera appréciée.

Merci

+0

Comment savez-vous quand une ligne se termine vraiment? –

+0

Êtes-vous sûr que la terminaison de ligne est \ n, pas \ r ou \ r \ n? –

+0

la ligne de fin est "| \ n", est juste après la deuxième JDP –

Répondre

1

EDIT: vous ne pas besoin d'un fichier 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 fichier est Unix, DOS ou MAC.

/EDIT

Il ne peut se faire sans un fichier de format. Alors, créez un fichier 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  "" 

Puis:

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 
+0

Merci Peter !!, je vais l'essayer tout de suite. Votre exemple est plus complet et précis que la documentation que j'ai examinée. –

+0

Voici ma référence habituelle: http://msdn.microsoft.com/en-us/library/ms191479.aspx –

+0

Peter, j'ai essayé la solution mais j'ai la même erreur. J'ai modifié le "\ n" en "| \ n" dans le fichier de format. Je reçois cette erreur: Serveur: Msg 4866, niveau 17, état 66, ligne 1 L'insertion en bloc échoue. La colonne est trop longue dans le fichier de données pour la ligne 1, colonne 1. Assurez-vous que la terminaison de zone et la terminaison de ligne sont correctement spécifiées. Serveur: Msg 7399, niveau 16, état 1, ligne 1 Le fournisseur OLE DB 'STREAM' a signalé une erreur. Le fournisseur n'a donné aucune information sur l'erreur. OLE DB erreur trace [Fournisseur OLE/DB 'STREAM' IRowset :: GetNextRows retourné 0x80004005: –

1

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

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