Avatar billede stenmadsen Nybegynder
09. juni 2002 - 11:31 Der er 2 kommentarer og
1 løsning

problem med BULK INSERT og UNICODE i SQL server 2000

Når jeg forsøger med BULK INSERT af data fra en unicode file (lavet med notepad) får jeg  følgende fejl

Server: Msg 8152, Level 16, State 6, Line 1
String or binary data would be truncated.
The statement has been terminated.


Mit SQL-statement ser således ud:

CREATE TABLE [test2] (
    [tekst1] [nvarchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [tekst2] [nvarchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
GO

BULK INSERT testDB.dbo.test2
  FROM 'c:\projekter\test2.txt'
    WITH (FORMATFILE = 'c:\projekter\test2.fmt',
          FIRSTROW  = 1,
          DATAFILETYPE = 'widechar')
GO

Min format fil ser således ud:

8.0
2
1      SQLNCHAR      0      10    ","    1    tekst1    SQL_Latin1_General_CP1_CI_AS
2      SQLNCHAR      0      10    "\n"  2    tekst2    SQL_Latin1_General_CP1_CI_AS


og min datafil således:

aaaaaaaaaa,xxxxxxxxxx
bbbbbbbbbb,yyyyyyyyyy


Hvis jeg gemmer min datafil som ANSI og retter SQLNCHAR til SQLCHAR i format filen, samt  DATAFILETYPE = 'char' i SQL koden så virker det fint. Hvor er problemet.

Jeg tror selv at problemet må ligge i format filen, fordi hvis jeg undlader at bruge  format-filen ved fjerne FORMATFILE= samt indsætter FIELDTERMINATOR=',' og  ROWTERMINATER='\n' så går alt godt, også med en unicode datafil.

Skyldes det mon en fejl i SQL server 2000 eller gør jeg noget galt.
Avatar billede terry Ekspert
09. juni 2002 - 13:48 #1
stenmadsen>I have never used a Format file but reading Books Online IF you dont NOT specify a Format File then BCP prompts you for varios parameters such as storage type, prefix length, field length, and field and row terminators. Then if I have understood it correctly youthen get the chance to SAVE this file.
So have youy tried doing this so that SQL Server makes the format file for you?
Avatar billede stenmadsen Nybegynder
09. juni 2002 - 18:31 #2
Ja, jeg har forsøgt at eksportere fra SQL server til en flad fil i unicode format med bcp programmet. Både forsøg på at bruge den generede format fil med mine SQL statements og forsøg på at importere de eksportere data tilbage til SQL serveren med bcp ved hjælp af den generede format fil mislykkedes.
Avatar billede stenmadsen Nybegynder
10. juni 2002 - 19:58 #3
Da jeg ikke har kunnet finde nogen brugbar forklaring på mine problemer med BULK INSERT og  unicode data filer, så er her min egen research. Måske kan andre med samme problem få en  fornemmelse af problemets natur.

-------------------------------------

I) Unicode fil dannet med notepad

har følgende egenskaber:

1) 2-byte header  FF FE
2) 2-byte field terminator, f.eks 09 00 for tab
3) 4-byte end of line terminator f.eks. 0D 00 0A 00
4) alle øvrige tegn er 2-byte unicode

Den kan load'es til SQL server database med

bcp testDB..test in c:\data\test.txt -w


eller

BULK INSERT testDB.dbo.test
  FROM 'c:\projekter\test.txt'
    WITH (FIRSTROW  = 1,
          DATAFILETYPE = 'widechar')

GO

Det er ikke muligt at bruge format fil ved BULK INSERT.

------------------------------------

II) Unicode fil dannet med

bcp testDB..test out c:\data\test.txt

hvor der vælges nvarchar,0,10,\t og nvarchar,0,10,\n (hvis filen har 2 tekst felter)

har følgende egenskaber:
1) ingen header
2) 1-byte field terminator 09 for tab
3) 2-byte end of line terminator 0D 0A
4) alle øvrige tegn er 2-byte unicode

Den kan ikke indlæses ved

bcp testDB..test in c:\data\test.txt -w

men ved

bcp testDB..test in c:\data\test.txt -fc:\data\test.fmt

eller

bcp testDB..test in c:\data\test.txt

hvor man besvarer prompt'ene som da filen blev eksporeret fra SQL serveren


Med BULK INSERT kan data load'es med (BEMÆRK at DATAFILETYPE = 'char')

BULK INSERT testDB..test
  FROM 'c:\data\test.txt'
    WITH (FORMATFILE = 'c:\projekter\test.fmt',
          FIRSTROW  = 1,
          DATAFILETYPE = 'char')
GO

Format filen test.fmt ser således ud
8.0
2
1  SQLNCHAR  0  10  "\t"      1    tekst1    SQL_Latin1_General_CP1_CI_AS
2  SQLNCHAR  0  10  "\r\n"    2    tekst2    SQL_Latin1_General_CP1_CI_AS
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester