web-dev-qa-db-fra.com

Lecture d'un fichier texte avec SQL Server

J'essaie de lire un fichier texte à partir d'une requête SQL (SQL Server 2005), mais je n'ai aucune chance. J'ai essayé diverses choses avec EXEC et xp_cmdshell, mais toutes ne fonctionnent pas. C'est la façon générale que j'ai essayé d'aborder:

CREATE TABLE temp (data varchar(2000));
INSERT temp EXEC master.dbo.xp_cmdshell 'type file.txt';

J'essaie ensuite de sélectionner des données dans la table temporaire. J'ai beaucoup cherché et je ne peux pas dire ce qui ne va pas. Aidez-moi?

28
Markus O'Reilly

À quoi ressemble votre fichier texte ?? Chaque ligne un record?

Vous devrez vérifier l'instruction BULK INSERT - qui devrait ressembler à quelque chose comme:

BULK INSERT dbo.YourTableName
FROM 'D:\directory\YourFileName.csv'
WITH
(
  CODEPAGE = '1252',
  FIELDTERMINATOR = ';',
  CHECK_CONSTRAINTS
) 

Ici, dans mon cas, j'importe un fichier CSV - mais vous devriez aussi pouvoir importer un fichier texte.

Des documents MSDN, voici un exemple qui, espérons-le, fonctionne pour un fichier texte avec un champ par ligne:

BULK INSERT dbo.temp 
   FROM 'c:\temp\file.txt'
   WITH 
      (
         ROWTERMINATOR ='\n'
      )

Semble fonctionner parfaitement dans mon environnement de test :-)

38
marc_s

Je viens de découvrir ceci:

SELECT * FROM OPENROWSET(BULK N'<PATH_TO_FILE>', SINGLE_CLOB) AS Contents

Le contenu du fichier sera extrait sous la forme varchar (max). Remplacez SINGLE_CLOB par:

SINGLE_NCLOB pour nvarchar (max) SINGLE_BLOB pour varbinary (max)

Merci à http://www.mssqltips.com/sqlservertip/1643/using-openrowset-to-read-large-files-into-sql-server/ pour cela!

37
Cain

si vous voulez lire le fichier dans une table à la fois, utilisez BULK INSERT. D'un autre côté, si vous préférez analyser le fichier ligne par ligne pour effectuer vos propres vérifications, consultez le site Web suivant: https://www.simple-talk.com/sql/t-sql-programming/lecture-et-écriture-fichiers-dans-serveur-SQL-utilisant-t-sql/ Il est possible que vous deviez activer votre xp_cmdshell ou d'autres fonctions d'automatisation OLE. Simple Google il et le script va apparaître . Espérons être utile.

0
Rodrigo

Devez-vous le faire une fois ou dans le cadre d’une opération de base de données normale (en réponse à un déclencheur, à un événement planifié, etc.)?

De toute façon, vous feriez mieux de créer un package SSIS. 

  1. Dans SQL Management Studio, cliquez avec le bouton droit sur la base de données. 
  2. Sélectionner des tâches | Importer des données ...
  3. Suivez les instructions de l'assistant. Sélectionnez "fichier de texte plat" en tant que fournisseur lorsque vous y êtes invité. 

Je n'ai pas utilisé dbo.xp_cmdshell (selon votre exemple), mais j'imagine que la capture du résultat est le problème. 

0
3Dave