Question

Si j'exécute la requête suivante dans l'Analyseur de requêtes SQL Server 2000 :

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

Sur un fichier texte conforme au schéma d'OurTable pour 40 lignes, mais qui change ensuite de format pour les 20 dernières lignes (disons que les 20 dernières lignes ont moins de champs), je reçois une erreur.Cependant, les 40 premières lignes sont réservées à la table.Y a-t-il quelque chose dans la façon dont j'appelle Bulk Insert qui fait qu'il n'est pas transactionnel, ou dois-je faire quelque chose d'explicite pour le forcer à revenir en arrière en cas d'échec ?

Était-ce utile?

La solution

BULK INSERT agit comme une série d'individus INSERT et ainsi, si le travail échoue, il n'annule pas toutes les insertions validées.

Il peut cependant être placé dans une transaction afin que vous puissiez faire quelque chose comme ceci :

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

Autres conseils

Vous pouvez annuler les insertions.Pour ce faire, nous devons d’abord comprendre deux choses

BatchSize

:Nombre de lignes à insérer par transaction.La valeur par défaut est le fichier de données entier.Un fichier de données est donc en transaction

Supposons que vous ayez un fichier texte comportant 10 lignes et que la ligne 8 et la ligne 7 contiennent des détails non valides.Lorsque vous insérez en bloc le fichier sans spécifier ou en spécifiant la taille du lot, 8 sur 10 sont insérés dans le tableau.La ligne invalide, c'est-à-direLes 8ème et 7ème échouent et ne sont pas insérés.

Cela se produit parce que la valeur par défaut MAXERRORS le nombre est de 10 par transaction.

Selon MSDN :

MAXERREURS :

Spécifie le nombre maximum d'erreurs de syntaxe autorisées dans les données avant l'annulation de l'opération d'importation en vrac.Chaque ligne qui ne peut pas être importée par l'opération en vrac est ignorée et comptée comme une erreur.Si max_errors n'est pas spécifié, la valeur par défaut est 10.

Donc, pour faire échouer les 10 lignes même si l'une d'entre elles n'est pas valide, nous devons définir MAXERRORS=1 et BatchSize=1 Ici, le nombre de BatchSize compte également.

Si vous spécifiez BatchSize et que la ligne non valide se trouve à l'intérieur d'un lot particulier, le lot particulier sera restauré uniquement, et non l'ensemble des données dans son intégralité.Soyez donc prudent en choisissant cette option

J'espère que cela résout le problème.

Comme indiqué dans le BATCHSIZE définition de BULK INSERT dans MSDN Library (http://msdn.microsoft.com/en-us/library/ms188365(v=sql.105).aspx) :

"Si cela échoue, SQL Server valide ou annule la transaction pour chaque lot..."

En conclusion, il n'est pas nécessaire d'ajouter de la transactionnalité à Bulk Insert.

Essayez de le placer dans une transaction définie par l'utilisateur et voyez ce qui se passe.En fait, il devrait revenir en arrière comme vous l'avez décrit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top