2013-04-30 10 views
6

Sto provando a scaricare un insieme molto grande di dati da un file .csv in un database SQL Server 2012. Invece di fare migliaia di INSERT, sto indagando su bcp.BCP non restituisce errori, ma non copia alcuna riga

MODIFICA: Questo è per un processo automatizzato, e non solo una tantum. Inoltre, non ho i diritti BULK INSERT per questo database.

Quando provo a copiare i dati nel database, bcp non restituisce errori, ma in realtà non copia nulla: restituisce solo 0 rows copied. L'ho ridotto a un caso minimale che non funziona.

In primo luogo, creare una semplice tabella con due colonne:

CREATE TABLE [dbo].[mincase](
    [key] [varchar](36) NOT NULL, 
    [number] [int] NOT NULL 

    PRIMARY KEY CLUSTERED 
    (
     [key] ASC 
    ) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 40) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

Quindi, utilizzare bcp per creare un file di formato da questo. Nota che questo esempio crea un file in formato XML, ma non importa se è XML o nativo per questo.

bcp MyDB.dbo.mincase format nul -T -n -f mincasexml.fmt -x -S .\SQLEXPRESS 

Ora creare un file data.csv con una riga e due voci, delimitato da tabulazioni. Nel mio caso, il file è semplicemente:

somecharacters 12345 

Anche in questo caso, che è una scheda, non due spazi, e non sembra importare se ci sono finali a capo o meno.

Ora provate a utilizzare bcp con quel file di formato per inserire i dati da questo file:

bcp MyDB.dbo.mincase in data.csv -f mincasexml.fmt -T -S .\SQLEXPRESS 

Piuttosto che la copia dei dati alla base di dati, ottengo questo:

Starting copy... 

0 rows copied. 
Network packet size (bytes): 4096 
Clock Time (ms.) Total  : 1 

Qualcuno sa cosa sta succedendo qui?

Grazie!

+0

hai provato l'opzione IMPORTA DATI? –

risposta

8

Il comando bcp in genere richiede un identificatore per specificare la modalità di formattazione del file bcp.

  • -c specifica modalità caratteri (testo in chiaro)
  • -n specifica modalità nativa
  • -w specifica modalità Unicode

Nel tuo caso di test, il file creato è chiaro, in modo da dovrebbe specificare '-c' nel tuo bcp in comando.

bcp MyDB.dbo.mincase in data.csv -c -T -S .\SQLEXPRESS 

Microsoft Recommends utilizzando il '-n' per l'import export per evitare problemi con delimitatori di campo che appaiono entro i valori delle colonne (vedere la sezione sulla modalità carattere e modalità nativa Best Practices).

+1

Ecco, con una modifica minore: -f sovrascrive -c, quindi la rimozione del file di formato ha risolto completamente il problema. Il risultato finale è: 'bcp MyDB.dbo.mincase in data.csv -c -T -S. \ SQLEXPRESS' – Mark

+1

Great..fixing la mia risposta. –

1

Mi sono imbattuto in un problema simile, tranne che stavo già utilizzando un file di formato, quindi l'aggiunta di uno dei flag di formato non sarebbe di aiuto. Per chiunque altro finisca qui, voglio spiegare che cosa ha causato questo problema per me (e spero che aiuti a spiegare quale sia la causa del problema sottostante).

Il problema è che BCP non elabora effettivamente righe di testo in un file; piuttosto, elabora solo un flusso di dati, secondo le istruzioni fornite. Ciò significa che i newline saranno ignorati, se è questo che accetti (per sbaglio) di fare BCP.

Nel mio caso, questo si è rivelato essere un errore di battitura nell'ultima riga nel file di formato:

13.0 
1348 
1 SQLCHAR 0 21 "," 1 RecordKey "" 
2 SQLCHAR 0 30 "," 0 SubmissionKey "" 
3 SQLCHAR 0 1 "," 2 A1cLvl "" 
... 
1347 SQLCHAR 0 1 "," 0 WoundIntVac "" 
1348 SQLCHAR 0 1 "/r/n" 0 XClampTm "" 

Se si guarda da vicino, vedrete le barre sono a ritroso nel campo di terminazione su l'ultima riga. Quindi, anziché cercare terminazioni di linea in stile Windows, BCP cercava effettivamente la stringa di testo "/ r/n" nel flusso di dati.

Poiché la stringa non è stata effettivamente visualizzata nei miei dati, BCP non ha mai trovato nulla che corrisponda al mio campo finale. Quindi, ha senso che abbia trovato "0 righe" da copiare.

Non sono ancora sicuro del motivo per cui ciò non si traduce in qualcosa di simile a un errore "Inattesa EOF riscontrato" o qualcosa del genere, ma speriamo che qualcun altro sia in grado di espanderlo.

Problemi correlati