Domanda

Se eseguo la query in SQL Server 2000 Query Analyzer:

BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', ROWS_PER_BATCH = 10000, TABLOCK)

Su un file di testo conforme alle OurTable schema di 40 righe, ma poi cambia formato per le ultime 20 righe (diciamo le ultime 20 righe hanno un minor numero di campi), ho visualizzato un messaggio di errore.Tuttavia, i primi 40 linee sono impegnati per la tabella.C'è qualcosa circa il modo in cui sto chiamando Inserimento di Massa che rende non essere transazionale, o devo fare qualcosa di esplicito per forza di rollback in caso di errore?

È stato utile?

Soluzione

BULK INSERT agisce come una serie di singoli INSERT dichiarazioni e così, se il processo non riesce, non il rollback di tutte le commesse inserti.

Si può, tuttavia, essere collocati all'interno di una transazione, in modo che si potrebbe fare qualcosa di simile a questo:

BEGIN TRANSACTION
BEGIN TRY
BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', 
   ROWS_PER_BATCH = 10000, TABLOCK)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH

Altri suggerimenti

È possibile eseguire il rollback di inserti .Per fare questo abbiamo bisogno di capire due cose prima

BatchSize

:Il n ° di righe da inserire per ogni transazione .Il valore di Default è tutto File Di Dati.Così un file di dati di transazione

Diciamo che avete un file di testo con 10 righe e riga 8 Riga 7 ha alcuni dettagli non validi .Quando si Massa Inserire il file senza specificare o con specifica la Dimensione del lotto , 8 su 10 vengono inseriti nella tabella.Le Voci della Riga, cioè8 ° e 7 ° ottiene fallito e di non avere inserito.

Questo Accade perché il Default MAXERRORS conte è di 10 per ogni transazione.

Come da MSDN :

MAXERRORS :

Specifica il numero massimo di errori di sintassi consentiti nei dati prima dell'operazione di importazione di massa è annullata.Ogni riga che non può essere importati dall'operazione di importazione di massa è ignorata e considerata come errore.Se max_errors non è specificato, il valore predefinito è 10.

Quindi, per poter fallire tutte le 10 righe, anche se uno non è valido è necessario impostare MAXERRORS=1 e BatchSize=1 Qui il numero di BatchSize anche questioni.

Se si specifica BatchSize e la riga non valida è all'interno di un particolare lotto , sarà rollback particolare batch ,non l'intero set di dati.Quindi, essere attenti mentre la scelta di questa opzione

Spero che questo risolve il problema.

Come indicato nel BATCHSIZE definizione per BULK INSERT in MSDN Library (http://msdn.microsoft.com/en-us/library/ms188365(v=sql.105).aspx) :

"Se questo non funziona, SQL Server esegue il commit o il rollback della transazione per ogni lotto..."

In conclusione, non è necessario aggiungere transactionality per l'Inserimento di Massa.

Prova a metterlo all'interno di transazione definita dall'utente e vedere cosa succede.In realtà dovrebbe roll-back come l'hai spiegato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top