Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/04/2011, 10h15   #1
Invité de passage
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 2
Points : 2
Par défaut Extraire le résultat dans un fichier

Bonjour,

Je travaille sous SQL Server 2000.
Je souhaiterais extraire le résultat d'une requête dans un fichier texte pour ensuite lancer cette requete quotidiennement à une heure précise.

Le fichier de sortie pourrait-être un .txt ou mieux un .csv avec un semicolon comme séparateur.

Voici ma requête actuelle :

Code :
1
2
3
4
5
  SELECT *
    FROM T_STATISTICS
   WHERE EntryDate BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) - 1, 0)
                       AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE())    , 0)
ORDER BY EntryDate ASC
Merci de votre aide.
lanainejulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 10h57   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Vous pouvez plannifier un job windows qui lance une commande bcp.

Dans votre cas, quelque chose comme :

Code SQL :
1
2
 
bcp "SELECT * FROM T_STATISTICS WHERE (EntryDate BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) - 1, 0) AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)) ORDER BY EntryDate" queryout Monfichier.csv -T -c -t ;
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 11h28   #3
Invité de passage
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 2
Points : 2
Bonjour,

Merci de votre rapidité, mais je le job tourne en boucle.
J'ai crée un .bat dans lequel j'ai inséré le code que vous me suggérez.

La commande défile en boucle dans la fenetre CMD

Si j'esssaie de lancer cette commande directement dans la fenetre CMD (sans passer par un .bat), voici ce que j'obtiens :
bcp.jpg

Merci de votre aide,
lanainejulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 11h45   #4
Invité de passage
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 2
Points : 2
En bidouillant un peu j'ai trouvé mon erreur, il fallait des doubles quotes au lieu de simples quotes pour la query.
Par contre j'ai toujours un message d'erreur :
bcp.jpg

Merci de votre aide
lanainejulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 11h46   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
mettez des doubles quotes pour la requete
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 11h47   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
il ne trouve pas la table, donnez lui un coup de main, en précisant la BDD et le schéma :

Code SQL :
1
2
3
 
SELECT ...
FROM Base.Schéma.TABLE
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h05   #7
Invité de passage
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 2
Points : 2
Je suis désolée je débute en SQL, qu'entendez-vous par schéma ?
Entre-temps, j'ai modifié la syntaxe, voilà ce que cela donne :

Code :
bcp "SELECT * FROM T_STATISTICS WHERE (EntryDate BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) - 1, 0) AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)) ORDER BY EntryDate" queryout c:\Monfichier.csv  -c -t -S VTB\VTB -U sa -P *****;
Malgré cela, j'obtiens toujours :
Citation:
Ce serveur SQL n'existe pas ou son accès est refusé "
Help me please !
lanainejulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 13h30   #8
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par lanainejulie Voir le message
Je suis désolée je débute en SQL, qu'entendez-vous par schéma ?
rapidement, les schéma permettent de "découper" votre base en sous-ensemble logiques, par exemple en fonction des domaines d'application.
Par exemple, dans une BDD, vous pouvez avoir une schéma poru toutes les tables qui concernent les compta, un autre pour tout ce qui concerne la production,...

Mais vue votre réponse, je pense qu'il s'agit dans votre cas du schéma par défaut, à savoir "dbo"

reste à savoir le nom de votre BDD.

BDD.dbo.LaTable


Citation:
Entre-temps, j'ai modifié la syntaxe, voilà ce que cela donne :

bcp "SELECT * FROM T_STATISTICS WHERE (EntryDate BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) - 1, 0) AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)) ORDER BY EntryDate" queryout c:\Monfichier.csv -c -t -S VTB\VTB -U sa -P *****;

Malgré cela, j'obtiens toujours :
Ce serveur SQL n'existe pas ou son accès est refusé "

Help me please !
1/ Quel est le nom de votre serveur ?
2/ le ";" doit suivre l'option "-t" qui indique le séparateur de champs dans votre CSV (sinon par défaut c'est une tabulation)
3/ si votre mot de passe contient des caracteres spéciaux, mettez le entre guillemets


En supposant que le nom de votre serveur de BDD soit VTB, et que votre base de donnée soit également VTB, ca donerait :
Code :
1
2
 
bcp "SELECT * FROM VTB.dbo.T_STATISTICS WHERE (EntryDate BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) - 1, 0) AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)) ORDER BY EntryDate" queryout c:\Monfichier.csv  -c -t ; -S VTB -U sa -P "*****"
(vous pouvez aussi spécifier le nom de la base de données avec l'option -d )
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 13h57   #9
Invité de passage
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 2
Points : 2
Impeccable, merci beaucoup en utilisant cette commande tout fonctionne
Une dernière petite question, comment faire pour que l'entête des colonnes soient également exportée ??

De plus, lors que j'essaie de lancer ce travail via un batch, le fichier tourne en boucle et aucun fichier n'est généré.
Est-il possible de lancer la commande bcp de manière automatique ??? Je souhaiterais que cette extraction soit faite tous les jours.


Merci
lanainejulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 14h35   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par lanainejulie Voir le message
Une dernière petite question,
Dommage que ce n'etait pas la première, car bcp ne le permet pas nativement

Il y a donc deux solutions :
1/utiliser autre chose que bcp (genre osql)
2/inclure les noms de colonnes dans votre requete, avec un union all. Mais dans ce cas il faut caster toutes vos colonnes en varchar

donc votre requete ressemblerait a :
Code SQL :
1
2
3
4
5
6
7
8
9
10
 
SELECT 
    'NomCol1',
    'NomCol2'
UNION ALL
SELECT 
    CAST(UneColonne AS VARCHAR(n)),
    CAST(UneAutreColonne AS VARCHAR(n))
FROM 
    --le reste de votre requete

Pourquoi voulez vous inclure les noms de colonne ? Le csv ne sera-t-il pas par la suite traité automatiquement ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h37.


 
 
 
 
Partenaires

Hébergement Web