IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Outils SQL Server Discussion :

BCP et les requêts SQL


Sujet :

Outils SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Juin 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Juin 2004
    Messages : 19
    Points : 7
    Points
    7
    Par défaut BCP et les requêts SQL
    Bonjour,
    La commande suivante marche parfaitement en ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BCP "SELECT * FROM EXERCICES" queryout D:\Donnees\Doc_communs\WaveSoft\Bodin\FILENAME.csv -t; -S FDSSERVER\WAVESOFT -d BODIN -c -T
    Elle n'a d'autre intérêt que d'essayer d'expliquer mon pb.

    La Cde SQL suivante fonctionne elle aussi parfaitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @SQL NVARCHAR(4000)
    SET @SQL = 'BCP "SELECT * FROM EXERCICES" queryout D:\Donnees\Doc_communs\WaveSoft\Bodin\FILENAME.csv -t; -S FDSSERVER\WAVESOFT -d BODIN -c -T'
    EXEC MASTER..XP_CMDSHELL @SQL
    Le but est d'exporter le résultat d'une requête dans un fichier texte

    Evidemment en production réelle la requête sera plus "évoluée"

    Par exemple quand je veux introduire des données fixes à exporter cela ne marche plus

    Comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BCP "SELECT '00001' FROM EXERCICES" queryout D:\Donnees\Doc_communs\WaveSoft\Bodin\FILENAME.csv -t; -S FDSSERVER\WAVESOFT -d BODIN -c -T
    En ligne de commande : OK

    Mais dans une requête SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DECLARE @SQL NVARCHAR(4000)
    SET @SQL = 'BCP "SELECT '00001' FROM EXERCICES" queryout D:\Donnees\Doc_communs\WaveSoft\Bodin\FILENAME.csv -t; -S FDSSERVER\WAVESOFT -d BODIN -c -T'
    EXEC MASTER..XP_CMDSHELL @SQL
    Message erreur :

    Msg 102, Level 15, State 1, Line 4
    Incorrect syntax near '00001'.

    Les cotes sont interprétées comme la fin de la variable et non comme faisant partie de son contenu

    Donc les questions sont :
    - comment faire passer ces valeurs fixes en paramètre de BCP
    - comment faire passer également des variables, par exemple pour créer le nom de fichier en dynamique en fonction de la date.

    Christophe

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Citation Envoyé par Chess_cgi Voir le message

    Les cotes sont interprétées comme la fin de la variable et non comme faisant partie de son contenu
    à l'intérieur des chaines, il faut doubler les guillemets simples.

    donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DECLARE @SQL NVARCHAR(4000)
    SET @SQL = 'BCP "SELECT ''00001'' FROM EXERCICES" queryout D:\Donnees\Doc_communs\WaveSoft\Bodin\FILENAME.csv -t; -S FDSSERVER\WAVESOFT -d BODIN -c -T'
    EXEC MASTER..XP_CMDSHELL @SQL
    (notez qu'il s'agit de deux guillemets simples et non d'un guillemet double...)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Juin 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Juin 2004
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Ok merci super cela fonctionne bien sur ma requête "simple"

    Par contre c'est plus compliqué à mettre en oeuvre sur la vraie requête, elle va devenir encore plus illisible, ej vais essayer malgré tout.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    SELECT CHAMP1
    FROM
    (
     
     SELECT
     
    champ1
     
    FROM
     
    (  /* Attribution 1 Vente */
     
    SELECT V_LST_TICKET.TCKDATE AS DATETICKET, V_LST_TICKET.TCKNUM  AS TICKET,    '00001' AS NUMLIGNE, concat('1', ';' , '167000',  ';' ,/* Code magasin */ 
    RIGHT(CAST(V_LST_TICKET.TCKDATE AS DATE), 2) , + substring(cast(CAST(V_LST_TICKET.TCKDATE AS date) AS char), 6, 2) + LEFT(CAST(V_LST_TICKET.TCKDATE AS DATE), 4),  ';' ,/* Date */
     'C1',  ';' ,/* Code caisse */
    RIGHT(REPLICATE('0', 10) + COALESCE (RIGHT(V_LST_TICKET.TCKNUM,6), ''), 10),  ';' ,/* Numéro ticket */
     LEFT(CAST(V_LST_TICKET.TCKDATE AS TIME), 2) + substring(cast(CAST(V_LST_TICKET.TCKDATE AS TIME) AS char), 4, 2),  ';' ,/* Heure Transaction */ 
    LEFT( ARTICLES.ARTCODE, 2 ) + SUBSTRING(ARTICLES.ARTCODE, 4,2) + SUBSTRING(ARTICLES.ARTCODE, 7,2),  ';' ,/* Groupe Nomenclature */ 
    RIGHT(ARTICLES.ARTCODE,16) ,  ';' ,/* Code Barre */ 
    RIGHT( concat(REPLICATE('0', 7), substring( CONVERT(varchar,  ABS(PIECEVENTELIGNES.PLVQTE)), 1,  CHARINDEX( '.', CONVERT(varchar,  ABS(PIECEVENTELIGNES.PLVQTE) ) )-1  ), substring( CONVERT(varchar,  ABS(PIECEVENTELIGNES.PLVQTE)), CHARINDEX( '.', CONVERT(varchar,  ABS(PIECEVENTELIGNES.PLVQTE) ) ) + 1, 2  ) ), 7), /* Quantité */  ';' ,
     CASE  
    WHEN PIECEVENTELIGNES.PLVMNTNETHT > 0 THEN  'F' 
    WHEN PIECEVENTELIGNES.PLVMNTNETHT < 0 THEN  'A' 
    ELSE 'F'
    END ,  ';' ,
    'EUR', /* Devise */ ';' ,
    RIGHT( concat(REPLICATE('0', 7), substring( CONVERT(varchar,  ABS(PIECEVENTELIGNES.PLVMNTNETHT)* ( 1 + PIECEVENTELIGNES.TVATAUX ) ), 1,
      CHARINDEX( '.', CONVERT(varchar,  ABS(PIECEVENTELIGNES.PLVMNTNETHT)* ( 1 + PIECEVENTELIGNES.TVATAUX ) ) )-1  ), 
    substring( CONVERT(varchar,  ABS(PIECEVENTELIGNES.PLVMNTNETHT)* ( 1 + PIECEVENTELIGNES.TVATAUX )),
     CHARINDEX( '.', CONVERT(varchar, ABS(PIECEVENTELIGNES.PLVMNTNETHT)* ( 1 + PIECEVENTELIGNES.TVATAUX ) ) ) + 1, 2  ) ), 7), /* Prix unitaire ttc */  ';' ,
    '0000000', /* Montant remise*/ ';' ,
    '0', /* Points supplémentaires */ ';' ,
    substring(PIECEVENTELIGNES.PLVDESIGNATION,1,30)/* Désignation article */
     ) AS Champ1
     
    FROM  V_LST_TICKET LEFT OUTER JOIN  PIECEVENTELIGNES
     ON (V_LST_TICKET.TCKID = PIECEVENTELIGNES.TCKID)
     AND (V_LST_TICKET.PCVID = PIECEVENTELIGNES.PCVID), ARTICLES, TIERS
     
    WHERE PIECEVENTELIGNES.ARTID = ARTICLES.ARTID AND V_LST_TICKET.TIRID = TIERS.TIRID  
     AND PIECEVENTELIGNES.PLVTYPE = 'L' AND LEFT( ARTICLES.ARTCODE, 5 ) <> 'FIDEL' AND LEFT(V_LST_TICKET.TCKNUM,2) = 'T_' AND LEN(RTRIM(TIERS.TIRIDCARTE)) <> 0
     
     
     
    UNION  /* Attribution 3 Chèque fidélité */
     
    SELECT V_LST_TICKET.TCKDATE AS DATETICKET, V_LST_TICKET.TCKNUM  AS TICKET,    '00002' AS NUMLIGNE, concat('3', ';' , '167000',  ';' ,/* Code magasin */ 
    RIGHT(CAST(V_LST_TICKET.TCKDATE AS DATE), 2) , + substring(cast(CAST(V_LST_TICKET.TCKDATE AS date) AS char), 6, 2) + LEFT(CAST(V_LST_TICKET.TCKDATE AS DATE), 4),  ';' ,/* Date */
     'C1',  ';' ,/* Code caisse */
     RIGHT(REPLICATE('0', 10) + COALESCE (RIGHT(V_LST_TICKET.TCKNUM,6), ''), 10),  ';' ,/* Numéro ticket */
     LEFT(CAST(V_LST_TICKET.TCKDATE AS TIME), 2) + substring(cast(CAST(V_LST_TICKET.TCKDATE AS TIME) AS char), 4, 2),  ';' ,/* Heure Transaction */ 
    '000000',  ';' ,/* Groupe Nomenclature */ 
    '2888888021236',  ';' ,/* Code Barre */ 
    '0000000', /* Quantité */  ';' ,
     CASE  
    WHEN PIECEVENTELIGNES.PLVMNTNETHT > 0 THEN  'F' 
    WHEN PIECEVENTELIGNES.PLVMNTNETHT < 0 THEN  'A' 
    ELSE 'F'
    END ,  ';' ,
    'EUR', /* Devise */ ';' ,
    '0000000', /* Prix unitaire ttc */  ';' ,
    '0000000', /* Montant remise*/ ';' ,
    '0', /* Points supplémentaires */ ';' ,
    substring(PIECEVENTELIGNES.PLVDESIGNATION,1,30) /* Désignation article */
     ) AS Champ1
     
    FROM  V_LST_TICKET LEFT OUTER JOIN  PIECEVENTELIGNES
     ON (V_LST_TICKET.TCKID = PIECEVENTELIGNES.TCKID)
     AND (V_LST_TICKET.PCVID = PIECEVENTELIGNES.PCVID), ARTICLES
     
    WHERE PIECEVENTELIGNES.ARTID = ARTICLES.ARTID AND PIECEVENTELIGNES.PLVTYPE = 'L' AND LEFT( ARTICLES.ARTCODE, 5 ) = 'FIDEL' AND LEFT(V_LST_TICKET.TCKNUM,2) = 'T_'
     
    UNION /* Attribution 2 Signature de fin de ticket */
     
    SELECT V_LST_TICKET.TCKDATE AS DATETICKET, V_LST_TICKET.TCKNUM AS TICKET,   '00003' AS NUMLIGNE, concat('2', ';' , '167000',  ';' ,/* Code magasin */ 
    RIGHT(CAST(V_LST_TICKET.TCKDATE AS DATE), 2) , + substring(cast(CAST(V_LST_TICKET.TCKDATE AS date) AS char), 6, 2) + LEFT(CAST(V_LST_TICKET.TCKDATE AS DATE), 4),  ';' ,/* Date */
     'C1',  ';' ,/* Code caisse */
     RIGHT(REPLICATE('0', 10) + COALESCE (RIGHT(V_LST_TICKET.TCKNUM,6), ''), 10),  ';' ,/* Numéro ticket */
     LEFT(CAST(V_LST_TICKET.TCKDATE AS TIME), 2) + substring(cast(CAST(V_LST_TICKET.TCKDATE AS TIME) AS char), 4, 2),  ';' ,/* Heure Transaction */ 
    '',  ';' ,/* Groupe Nomenclature */ 
    TIERS.TIRIDCARTE,  ';' ,/* Code Carte fidélité Client */ 
    RIGHT( concat(REPLICATE('0', 7), substring( CONVERT(varchar,  ABS(V_LST_TICKET.nbArticles)), 1,  CHARINDEX( '.', CONVERT(varchar,  ABS(V_LST_TICKET.nbArticles) ) )-1  ), substring( CONVERT(varchar,  ABS(V_LST_TICKET.nbArticles)), CHARINDEX( '.', CONVERT(varchar,  ABS(V_LST_TICKET.nbArticles) ) ) + 1, 2  ) ), 7), /* Nb Articles */  ';' ,
     CASE  
    WHEN  V_LST_TICKET.MontantTTC > 0 THEN  'F' 
    WHEN  V_LST_TICKET.MontantTTC < 0 THEN  'A' 
    ELSE 'F'
    END ,  ';' ,
    'EUR', /* Devise */ ';' ,
    RIGHT( concat(REPLICATE('0', 7), substring( CONVERT(varchar,  ABS(V_LST_TICKET.MontantTTC) ), 1,  CHARINDEX( '.', CONVERT(varchar,  ABS(V_LST_TICKET.MontantTTC) ) )-1  ), 
    substring( CONVERT(varchar,  ABS(V_LST_TICKET.MontantTTC)), CHARINDEX( '.', CONVERT(varchar, ABS(V_LST_TICKET.MontantTTC) ) ) + 1, 2  ) ), 7), /* Prix unitaire ttc */  ';' ,
    '0000000', /* Montant remise*/ ';' ,
    '0', /* Points supplémentaires */ ';' ,
    ''/* Vide */
     ) AS Champ1
     
    From V_LST_TICKET, TIERS
    WHERE V_LST_TICKET.TIRID = TIERS.TIRID AND LEFT(V_LST_TICKET.TCKNUM,2) = 'T_'  AND LEN(RTRIM(TIERS.TIRIDCARTE)) <> 0
     
    ) VUE
     
    WHERE CAST(DATETICKET AS DATE)  = @date
     
     
    ) VUE1
     
    UNION ALL/* Signature de fin de fichier */
     
    SELECT     TOP 1  CONCAT( '5167000_',left(@datetxt,4),substring(@datetxt,6,2),right(@datetxt,2),'.',LOWER('txt'),'_FIN' ) AS CHAMP1

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    vous pouvez créer une vue avec la requête, et appeler la vue dans le BCP.

    La requête restera plus lisible, ça facilitera la maintenance...

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Juin 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Juin 2004
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Est que la taille de la requête SQL est limitée ?
    Je n 'arrive pas à trouver cette information.

    Genre dans la requête suivante, tout se passe bien :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    DECLARE @datetxt as varchar(10), @SQL as VARCHAR(8000);
     
    DECLARE @nomBase VARCHAR(50)
    DECLARE @nomFichier VARCHAR(256)
    DECLARE @date VARCHAR(20)
    DECLARE @chemin VARCHAR(256) 
     
    set @chemin = 'D:\Donnees\Doc_communs\WaveSoft\Bodin\'
    SELECT @date = FORMAT(GETDATE(),'yyyyMMddHHmmss')
    set @nomFichier =  @CHEMIN + '167000_' + left(@date,8) + '.csv'
     
    SET @SQL = 'BCP "SELECT exercices.exeid, ''00001'' FROM EXERCICES" queryout ' + @nomFichier + ' -t; -S FDSSERVER\WAVESOFT -d BODIN -c -T'
    print @sql
    print @nomfichier
     
    EXEC MASTER..XP_CMDSHELL @sql
    Par contre avec une requête bcp plus longue pose pb.

    Voir retour en pièce jointe

    D'ou la question Ne serait on pas limité dans la taille de la requête ?
    Images attachées Images attachées  

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    XP_CMDSHELL est limité à VARCHAR(8000) ou NVARCHAR(4000).

    Là encore, une vue peut résoudre avantageusement le probléme

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Juin 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Juin 2004
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    En fait je viens de voir que la var contenant la requête ne dois pas contenir de retour ligne
    Sinon BCP ne l'interprète pas correctement.

    Ce qui veut dire que le code suivant ne marche pas, alors que le même sans retour ligne, après BCP " dans la variable fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    DECLARE @SQL as VARCHAR(8000);
     
    DECLARE @nomFichier VARCHAR(256)
    DECLARE @date VARCHAR(20)
    DECLARE @chemin VARCHAR(256) 
     
    set @chemin = 'D:\Donnees\Doc_communs\WaveSoft\Bodin\'
    SELECT @date = FORMAT(GETDATE(),'yyyyMMddHHmmss')
    set @nomFichier =  @CHEMIN + '167000_' + left(@date,8) + '.csv'
     
    SET @SQL = 'BCP "
     SELECT * FROM v_ext_lst_fidelite " queryout ' + @nomFichier + ' -t; -S FDSSERVER\WAVESOFT -d BODIN -c -T'
     
    print @sql
     
    EXEC MASTER..XP_CMDSHELL @sql
    La vue : OK mais il me faut tout repenser ce que je veux éviter

    Merci de ton aide en tout cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Sprintf ou concaténation pour créer les requêtes SQL?
    Par EvilAngel dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/09/2006, 17h08
  2. Capter les requêtes SQL
    Par ced62 dans le forum Oracle
    Réponses: 12
    Dernier message: 28/06/2006, 17h32
  3. [D5][BDE][Multibase] Récupérer les requêtes SQL d'une TTable
    Par Escandil dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/01/2006, 14h29
  4. [iBatis] Logger les requètes SQL
    Par bslota dans le forum Persistance des données
    Réponses: 2
    Dernier message: 25/11/2005, 14h29
  5. tracer les requêtes SQL
    Par izioto dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 13/10/2005, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo