Question

Je souhaite importer un fichier texte d'une colonne dans l'une de mes tables SQL. Le fichier est juste une liste de gros mots.

J'ai écrit le TSQL suivant pour le faire

BULK INSERT SwearWords
FROM 'c:\swears.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)

Cependant, il y a une erreur avec une fin de fichier non apparue. La table d'importation est simplement un champ d'identité suivi d'un champ nvarchar dans lequel je veux insérer le texte. Cela fonctionne bien si j'ajoute dans le fichier texte "1". au début de la ligne eveyr, je suppose que c’est parce que SQL cherche 2 champs. Y a-t-il un moyen de contourner cela?

Merci

Était-ce utile?

La solution

Vous devez utiliser FORMATFILE pour cela. Voir INSERTION DE VRAC .

  

FORMATFILE [= 'chemin_fichier_format']

     

Spécifie le chemin complet d'un format   fichier. Un fichier de format décrit les données   fichier qui contient les réponses stockées   créé à l’aide de l’utilitaire bcp sur le   même table ou vue. Le fichier de format   doit être utilisé dans les cas où:

* The data file contains greater or fewer columns than the table or view.

* The columns are in a different order.

* The column delimiters vary.

* There are other changes in the data format. Format files are usually created by using the bcp utility and modified with a text editor as needed. For more information, see bcp Utility.

Pour plus d'informations, voir Utilisation des fichiers de format .

Autres conseils

Ceci est décrit dans les livres en ligne pour BULK INSERT sous l’argument KEEPIDENTITY. Voici ce qui est dit

  

KEEPIDENTITY   Spécifie que les valeurs d'une colonne d'identité sont présentes dans le fichier importé. Si KEEPIDENTITY n'est pas indiqué, les valeurs d'identité de cette colonne du fichier de données importé sont ignorées et SQL Server attribue automatiquement des valeurs uniques en fonction des valeurs de départ et d'incrément spécifiées lors de la création de la table. Si le fichier de données ne contient pas de valeurs pour la colonne d'identité dans la table ou la vue, utilisez un fichier de format pour indiquer que la colonne d'identité de la table ou de la vue doit être ignorée lors de l'importation de données. SQL Server attribue automatiquement des valeurs uniques à la colonne

Donc, utilisez un fichier de format ou fournissez une valeur factice et veillez à ne pas utiliser l'argument KEEPIDENTITY

De plus, vous pouvez créer une vue sur votre table basée uniquement sur la colonne nvarchar, puis insérer BULK INSERT dans votre vue. C’est une façon très propre d’utiliser BULK INSERT.

Ainsi, vous n'avez pas à vous soucier de votre colonne IDENTITY ni de la création d'un fichier de format.

Votre instruction BULK INSERT devrait ressembler à ceci:

BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n')

Vous devez vous assurer que la structure de votre fichier texte et celle de la table correspondent. Si la table comporte deux champs, vous devrez également fournir deux champs / colonnes dans le fichier texte.

Étant donné que la première colonne de la table SQL est un champ IDENTITY, vous pouvez fournir n'importe quelle valeur, mais vous devez avoir une valeur dans ce champ. Je ne pense pas qu'il soit possible de contourner ce problème.

Marc

Vérifiez que la dernière ligne a CR / LF (\ r \ n). Parfois, c’est le problème, parfois, un retour chariot supplémentaire se trouve à la fin du fichier. Vous pouvez vérifier cela avec un hexeditor.

Vous pouvez supprimer la colonne d'identité et la remettre lorsque vous avez terminé. Sinon, si cela rompt les relations entre vos bases de données, vous pouvez importer à l'aide de DTS ou de SSIS s'il s'agit d'une importation unique - contrôle plus granulaire du bidouillage des colonnes

Dans SQL Server 2008, il était plus facile de créer un fichier contenant beaucoup d'insertions et de le coller dans la fenêtre de requête de Management Studio, plutôt que de se battre pour obtenir les autorisations de fichier de format et d'insertion en bloc comme il se doit. :

USE YourDB
GO
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)

http://blog.sqlauthority.com/2008/07/02/sql-server-2008-insert-multiple-records-using-one-insert-statement-use-of-row -constructor /

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