Question

Je rencontre des difficultés lors de l'insertion en bloc d'un fichier contenant un champ dans le type de données texte. Il contient les entrées et le délimiteur des champs sont des tubes "|" & "; et le terminateur de ligne est "| \ n"

Je reçois une erreur de troncature pour les champs situés à côté du champ de texte. Je pense que l'insertion en bloc pense que les entrées dans le deuxième champ sont les lignes 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

Ceci 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 (enfin, vous ne pouvez pas le voir), il y a des entrées (marquées d'un CR) et l'insertion en bloc les confond avec une nouvelle ligne.

Toute aide sera appréciée.

Merci

Était-ce utile?

La solution

EDIT: vous n'avez 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 de type Unix, DOS ou MAC.

/ EDIT

Cela ne peut être fait 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       ""

Ensuite:

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, en SQL 2005 +:

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

Autres conseils

Les données sont incohérentes. Vous avez des lignes se terminant par \ (cr) par un champ, d'autres (cr) finissant par | séparateurs de colonnes

Cela ou bien vous avez des séparateurs de colonnes incohérents, certains \ (cr) , d'autres | . Si tel est le cas, vous aurez besoin d'un fichier de format traiter chaque "colonne" séparée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top