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.
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
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
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
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..
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...
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...