Import TXT in SQL

lunedì 26 marzo 2012 - 15.22

hellen Profilo | Newbie

come posso importare un file TXT a larghezza fissa in una tabella di SQL? Con BULK o BCP trovo solo esempi di file con un carattere delimitatore, il mio file è così:
001 descrizriga1 1296
002 descrriga2 1547
grazie mille, buon lavoro!
Hellen!!

alx_81 Profilo | Guru

Ciao e benvenuta su dotnethell.it!

>come posso importare un file TXT a larghezza fissa in una tabella
>di SQL? Con BULK o BCP trovo solo esempi di file con un carattere
>delimitatore, il mio file è così:
leggi un attimo qui: http://social.msdn.microsoft.com/Forums/en-US/sqltools/thread/a8aacb52-50bf-4d33-8ee8-bf88b02153ad

>grazie mille, buon lavoro!
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

iif Profilo | Expert

>come posso importare un file TXT a larghezza fissa in una tabella
>di SQL? Con BULK o BCP trovo solo esempi di file con un carattere
>delimitatore, il mio file è così:
>001 descrizriga1 1296
>002 descrriga2 1547
>grazie mille, buon lavoro!
>Hellen!!

Dipende, se è un'operazione di routine ti conviene scrivere del codice, altrimenti puoi utilizzare la funzione import dati di sql server.

lbenaglia Profilo | Guru

>Dipende, se è un'operazione di routine ti conviene scrivere del
>codice, altrimenti puoi utilizzare la funzione import dati di
>sql server.

Ma no, dai, con bcp/bulk insert è un gioco da ragazzi:
http://groups.google.com/forum/?fromgroups&hl=it#!msg/microsoft.public.it.sql/0OiHZs1c4x4/QI_7Uwny9yQJ

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

hellen Profilo | Newbie

Grazie x la risposta,
visto che è il mio 1° post capirai che sono alle prime armi...
Ho guardato l'esempio ma non sono riuscita a riprodurlo per il mio file. Mi puoi scrivere il codice che devo mettere in SQL per importare un file TXT salvato in C:\ in una tabella già creata nel mio database SQL?
Il file TXT è di lunghezza fissa, il codice è 4 caratteri, la descizione 20 caratteri, ecc.. senza spazi o delimitatori tra un campo e l'altro.
Grazie mille ancora!
Hellen

lbenaglia Profilo | Guru

>Ho guardato l'esempio ma non sono riuscita a riprodurlo per il
>mio file. Mi puoi scrivere il codice che devo mettere in SQL
>per importare un file TXT salvato in C:\ in una tabella già creata
>nel mio database SQL?

Ciao Hellen,

per farlo ho bisogno:

- del file txt;
- del comando di CREATE TABLE della tua tabella.

Allega questi file in uno zip e vedo di darti una mano.

>Grazie mille ancora!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

hellen Profilo | Newbie

Grazie Lorenzo!
il file TXT te lo mando un po' accorciato visto che sarebbero 900.000 record...
la tabella l'ho creata manualmente in SQL, ti mando la copia schermo con i nomi dei campi..
Praticamente in F1 vanno i caratteri dal 10 al 30,
F2 dal 31 al 71,
F3 dal 72 al 84 (campo numerico),
F4 dal 85 al 86,
F5 dal 93 al 94,
F6 dal 95 al 102 (campo data),
F7 dal 103 al 105
Grazie mille!

lbenaglia Profilo | Guru

>il file TXT te lo mando un po' accorciato visto che sarebbero
>900.000 record...
>la tabella l'ho creata manualmente in SQL, ti mando la copia
>schermo con i nomi dei campi..
>Praticamente in F1 vanno i caratteri dal 10 al 30,
> F2 dal 31 al 71,
> F3 dal 72 al 84 (campo numerico),
> F4 dal 85 al 86,
> F5 dal 93 al 94,
> F6 dal 95 al 102 (campo data),
> F7 dal 103 al 105
Perdonami, ma non mi trovo per niente nel confronto tra la tabella, il file allegato e il modo con cui intendi popolarla.
Un esempio per tutti: le righe sono di 93 crt, non esite alcuna informazione datetime, i caratteri dal 72 all'84 non sono numerici, ecc.

Sicura di averci passato le informazioni esatte?

>Grazie mille!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

hellen Profilo | Newbie

Scusa Lorenzo!!!!
Ti ho scritto i vecchi riferimenti col nuovo file....
Ricapitolo tutto:
F1 10-29
F2 30-69
F3 70-82
F4 83-84
F5 91-92
F6 campo data che va messo per tutti i record in automatico uguale alla data dell'import
F7 93-94
Scusami tantissimo!!!
e Grazie mille! spero che adesso sia tutto corretto..
Hellen

lbenaglia Profilo | Guru

>Ti ho scritto i vecchi riferimenti col nuovo file....
>Ricapitolo tutto:
>F1 10-29
>F2 30-69
>F3 70-82
>F4 83-84
>F5 91-92
>F6 campo data che va messo per tutti i record in automatico uguale
>alla data dell'import
>F7 93-94

Secondo me c'è ancora qualcosa che non quadra:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

F3 hai detto che deve essere numerico, ma come puoi vedere include la "N" e quindi è errato;
F4 mi puzza come anche F5;
F7 è decisamente sbagliato dato che le righe sono di 93crt.

Ritenta, sarai più fortunata

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

hellen Profilo | Newbie

scusate..
L'F3 ha un carattere in meno cioè 70-81 e quindi
F4 82-83
F5 90-91
F6 campo data che va messo per tutti i record in automatico uguale alla data dell'import
F7 92-93
Prometto di non sbagliarmi più!!
Grazie ancora!

lbenaglia Profilo | Guru

>F5 90-91
>F6 campo data che va messo per tutti i record in automatico uguale
>alla data dell'import
>F7 92-93

Per me c'è ancora qualche errore con F5 e F7, pertanto ho fatto un po' di testa mia.
Nel file allegato troverai un esempio completo, prova a darci un'occhiata.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

hellen Profilo | Newbie

Ciao Lorenzo,
intanto grazie mille!!!
Una precisazione però, c'è un errore nella colonna F5 perchè non deve prendere quel valore.. deve prendere il 1° carattere che hai messo in F7 (in questo caso il valore 1) con il carattere precedente, e l'F7 deve prendere solo gli ultimi 2 caratteri (in questo caso il valore 21)... ho cercato di correggerlo ma non ci sono riuscita...
tutto il resto è ok!
Grazie ancora!
Hellen

IMPORTANDO L'INTERO FILE HO QUESTO TIPO DI ERRORE... AIUTO!!!
Messaggio 4867, livello 16, stato 1, riga 1
Errore di conversione dei dati durante il caricamento bulk (overflow). Riga 31305, colonna 4 (F3).
Messaggio 4867, livello 16, stato 1, riga 1
Errore di conversione dei dati durante il caricamento bulk (overflow). Riga 31339, colonna 4 (F3).
Messaggio 4867, livello 16, stato 1, riga 1
Errore di conversione dei dati durante il caricamento bulk (overflow). Riga 31340, colonna 4 (F3).
Messaggio 4867, livello 16, stato 1, riga 1
Errore di conversione dei dati durante il caricamento bulk (overflow). Riga 31341, colonna 4 (F3).
Messaggio 4867, livello 16, stato 1, riga 1
Errore di conversione dei dati durante il caricamento bulk (overflow). Riga 31342, colonna 4 (F3).
Messaggio 4867, livello 16, stato 1, riga 1
Errore di conversione dei dati durante il caricamento bulk (overflow). Riga 31343, colonna 4 (F3).
Messaggio 4867, livello 16, stato 1, riga 1
Errore di conversione dei dati durante il caricamento bulk (overflow). Riga 31344, colonna 4 (F3).
Messaggio 4867, livello 16, stato 1, riga 1
Errore di conversione dei dati durante il caricamento bulk (overflow). Riga 31378, colonna 4 (F3).
Messaggio 4867, livello 16, stato 1, riga 1
Errore di conversione dei dati durante il caricamento bulk (overflow). Riga 31382, colonna 4 (F3).
Messaggio 4867, livello 16, stato 1, riga 1
Errore di conversione dei dati durante il caricamento bulk (overflow). Riga 31383, colonna 4 (F3).
Messaggio 4867, livello 16, stato 1, riga 1
Errore di conversione dei dati durante il caricamento bulk (overflow). Riga 31384, colonna 4 (F3).
Messaggio 4865, livello 16, stato 1, riga 1
Impossibile eseguire il caricamento bulk perché è stato superato il numero massimo di errori (10).
Messaggio 7399, livello 16, stato 1, riga 1
Il provider OLE DB "BULK" per il server collegato "(null)" ha segnalato un errore. Il provider non ha fornito informazioni sull'errore.

Messaggio 7330, livello 16, stato 2, riga 1
Impossibile recuperare una riga dal provider OLE DB "BULK" per il server collegato "(null)".

lbenaglia Profilo | Guru

>Una precisazione però, c'è un errore nella colonna F5 perchè
>non deve prendere quel valore.. deve prendere il 1° carattere
>che hai messo in F7 (in questo caso il valore 1) con il carattere
>precedente, e l'F7 deve prendere solo gli ultimi 2 caratteri
>(in questo caso il valore 21)... ho cercato di correggerlo ma
>non ci sono riuscita...
Capito niente
Mi stai dicendo che F5 è sempre e solo il carattere alla posizione 91 mentre F7 i caratteri 92 e 93?

>IMPORTANDO L'INTERO FILE HO QUESTO TIPO DI ERRORE... AIUTO!!!
>Messaggio 4867, livello 16, stato 1, riga 1
>Errore di conversione dei dati durante il caricamento bulk (overflow).
>Riga 31305, colonna 4 (F3).
Bene, quella riga contiene un valore numerico superiore a 2^31-1 (2,147,483,647). In questo caso modifica il data type della colonna F3 in bigint. Per maggiori info:
http://msdn.microsoft.com/en-us/library/ms187745.aspx

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

hellen Profilo | Newbie

>Capito niente
>Mi stai dicendo che F5 è sempre e solo il carattere alla posizione 91 mentre F7 i caratteri 92 e 93?
Sì, F5 è di due caratteri 90-91 mentre F7 è di due caratteri 92-93

>Bene, quella riga contiene un valore numerico superiore a 2^31-1 (2,147,483,647). In questo caso modifica il data type della colonna F3 in bigint. Per maggiori >info:
>http://msdn.microsoft.com/en-us/library/ms187745.aspx
Ah ok, allora lo cambio in bigint

Grazie ancora, buonanotte!
Hellen

p.s. succede una cosa strana però, con bigint non ho più l'errore e infatti i valori nella colonna F3 li importa correttamente, ma se prendo un record di quella colonna (es:994500) e faccio l'update in un altra tabella dicendogli F3/100000 non dovrebbe darmi 9,945? invece mi da 9,000. COsa sbaglio?
Ri-Grazie

lbenaglia Profilo | Guru

>p.s. succede una cosa strana però, con bigint non ho più l'errore
>e infatti i valori nella colonna F3 li importa correttamente,
>ma se prendo un record di quella colonna (es:994500) e faccio
>l'update in un altra tabella dicendogli F3/100000 non dovrebbe
>darmi 9,945? invece mi da 9,000. COsa sbaglio?

Stai facendo una divisione tra interi ed il risultato è a sua volta un numero intero.
Se vuoi i decimali devi fare in modo che il dividendo, il divisore o entrambi siano decimali. Nel tuo caso potresti aggiungere il separatore decimale al divisore. In questo modo il dividendo verrà castato implicitamente a numeric(s,p) dando origine ad un risultato con il medesimo data type:

SELECT F3 / 100000. FROM...

>Ri-Grazie
Ri-prego.

Ciao!

--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5