Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

inserimento dati da file TXT

31 views
Skip to first unread message

FrancescoV

unread,
Nov 25, 2009, 7:07:33 AM11/25/09
to
Buongiorno,
mi sto appassionando di SQL ma sono ancora alle prime armi.
Utilizzo SQL Server Management Studio 2008

Vorrei automatizzare utilizzando SQL l'attuale gestione semi-manuale
dei log provenienti da un centralino.
Il centralino scarica periodicamente in formato TXT con campi
delimitati da ";" un log contenente i dati registrati dal log
precedente.

esiste secondo voi un modo (immagino una stored procedure) che mi
permetta di andare a immettere nel database i dati provenienti da
questi n file salvati in una cartella.. e al termine dell'importazione
di ciascun file spostarlo in una cartella "Done" in modo da non
rielaborarli ?

potete darmi qualche aiuto ?
grazie.

dawn

unread,
Nov 25, 2009, 8:19:05 AM11/25/09
to
On 25 Nov, 13:07, FrancescoV <vi...@tiscali.it> wrote:
> Il centralino scarica periodicamente in formato TXT con campi
> delimitati da ";" un log contenente i dati registrati dal log
> precedente.

E' il mestiere degli Integration Services; hai vincoli di fare tutto
da tsql o puoi valutarli?

da sql indaga su BULK INSERT opure su una cosa simile (tutto sui BOL):

INSERT INTO dbo.myTab (CLIENT_CODE, FLAG_ANNULL, DATE_IMM)
SELECT CLIENT_CODE,
CASE FLAG_ANNULL WHEN '''' THEN NULL ELSE FLAG_ANNULL END,
CASE ISDATE(SHIPPING_DATE) WHEN 1 THEN SHIPPING_DATE ELSE NULL END
FROM OPENROWSET(BULK 'myPath\Clients.txt', FORMATFILE='myPath
\Clients.fmt') AS T1

Il formato a cui si fa riferimento è un file di testo del tipo:
9.0
3
1 SQLCHAR 0 7 "" 1 CLIENT_CODE SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 1 "" 2 FLAG_ANNULL SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 8 "" 3 DATA_IMM SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 0 "\r\n" 0 EXTRAFIELD

Luca Bianchi

unread,
Nov 25, 2009, 8:29:35 AM11/25/09
to
> esiste secondo voi un modo (immagino una stored procedure) che mi
> permetta di andare a immettere nel database i dati provenienti da
> questi n file salvati in una cartella..

Di strade ce ne sono diverse. BULK-INSERT, Integration Services, bcp.exe

> e al termine dell'importazione
> di ciascun file spostarlo in una cartella "Done" in modo da non
> rielaborarli ?

Visto che devi fare questa attivit� dal sistema operativo escluderei solo il
BULK-INSERT (� un comando T-SQL) per non dover fare met� dell'attivit� via
T-SQL e l'altra met� da sistema operativo. Restano quindi SSIS e bcp.exe.
Con SSIS puoi creare soluzioni molto complesse con controlli di flusso ed
altre caratteristiche che forse non � il caso di scomodare. Dai un'occhiata
sul BOL a bcp (� una utility da riga di comando) e credo sia la soluzione
che ti render� presto operativo...

> potete darmi qualche aiuto ?
> grazie.

Bye


--
Luca Bianchi
Microsoft MVP - SQL Server
http://community.ugiss.org/blogs/lbianchi


FrancescoV

unread,
Nov 25, 2009, 11:17:02 AM11/25/09
to
ciao Luca,
grazie dei suggerimenti, mi hai aperto un mondo.
ho consultato la documentazione di bcp (http://msdn.microsoft.com/en-
us/library/ms162802.aspx), e mi sembra di capire sia proprio quello
che fa al caso mio.
ora si tratta di capire bene come funziona.

Se ho capito bene, potrei inserire l'esecuzione di bcp.exe in un batch
(schedulato) indicativamente composto in questo modo (perdonatemi
eventuali imprecisioni, non ho modo di testarlo)

move c:\log\*.* c:\log\work
for /f %%f in ('dir /b c:\log\work') do bcp.exe [centralino].[log] in
c:\log\work\%%f -F 2 -t ;
move c:\log\work\*.* c:\log\done

ho capito bene ?
ma l'associazione dei campi (il primo campo del file txt corrisponde
al campo xx della tabella del db) come viene fatto?
mi viene chiesta la creazione di un format file (quindi viene
autogenerato)?

grazie

FrancescoV

unread,
Nov 25, 2009, 1:08:28 PM11/25/09
to

ho qualche difficoltà:

C:\Log>BCP [centralino].[dbo].[centralino] in c:\log\a.txt -F 2 -t ; -
T -U SQL\Admin
SQLState = 08001, NativeError = 2
Error = [Microsoft][SQL Server Native Client 10.0]Provider named pipe:
Impossibi
le aprire una connessione a SQL Server [2].
SQLState = 08001, NativeError = 2
Error = [Microsoft][SQL Server Native Client 10.0]Si è verificato un
errore spec
ifico dell'istanza o relativo alla rete durante il tentativo di
stabilire una co
nnessione a SQL Server. Server non trovato o non accessibile.
Verificare che il
nome dell'istanza sia corretto e che il server sia configurato in modo
da consen
tire connessioni remote. Per ulteriori informazioni, vedere la
documentazione in
linea di SQL Server.
SQLState = S1T00, NativeError = 0
Error = [Microsoft][SQL Server Native Client 10.0]Timeout di accesso
scaduto

Immagino di sbagliare qualcosa nella connessione.. mi sapete dare
un'indicazione ?
quando genero uno script sulla tabella [centralino] mi genera in
automatico:
select from [Centralino].[dbo].[centralino] pertanto immagino che il
riferimento sia corretto..

FrancescoV

unread,
Nov 25, 2009, 1:51:12 PM11/25/09
to
ecco cosa succede quando tento la creazione del format:

C:\Log>bcp Centralino.dbo.centralino format null -c -t; -f "c:\log
\centralino.fmt" -S SQL\SQLEXPRESS -U ce -P ce
SQLState = 42000, NativeError = 229
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]
Autorizzazione SELECT negata per l'oggetto 'centralino' del database
'Centralino' con schema 'dbo'.

la connessione con il db dovrebbe essere ok, giusto ?
C:\Log>osql -S SQL\SQLEXPRESS -U ce -P ce
1>


O_o

grazie...

Luca Bianchi

unread,
Nov 26, 2009, 2:49:23 PM11/26/09
to
> Autorizzazione SELECT negata per l'oggetto 'centralino' del database
> 'Centralino' con schema 'dbo'.

Il messaggio mi sembra chiaro... L'utente ce non ha i permessi di select
sulla tabella dbo.centralino

> la connessione con il db dovrebbe essere ok, giusto ?
> C:\Log>osql -S SQL\SQLEXPRESS -U ce -P ce
> 1>

L'utente ce ha avuto accesso al database master. Se prosegui con

USE centralino
GO
SELECT * FROM centralino
GO

Otterrai lo stesso messaggio di autorizzazione negata...

> O_o
>
> grazie...

0 new messages