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

MS SQL Server Discussion :

procédure stocké et BCP Bulk Copy Program


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Par défaut procédure stocké et BCP Bulk Copy Program
    Bonjour à tout les gens qui vont lire mon message OU non

    J’ai deux questions qui semblent assez simples, mais moi je bloque dessus:

    A/ je veux savoir d’une manière simple comment créer une procédure stocké (avec un exemple que je peux tester (manager studio) je suis sous SQL server 2005)

    B/ Je dois faire des développements sur un outil qui utilise BCP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TRUNCATE TABLE Int_Contacts
     BCP BD_dev..Int_Contacts
     IN "E:\BD\DEV\Stage\Int_Contacts_($BATCH_ID).DAT"
     -f"E:\BD\DEV\Source\Format\Int_Contacts.FMT"
     -e"E:\BD\DEV\Archive\($BATCH_ID)\Log_HHmmss\\Int_Contacts.err"
     -UBD_dev
     -P*********** 
     -m100
     -hTABLOCK
    Je dois faire quelques modifications donc :

    1/comment tester ce script sans passer par l’inviter commande (dans manager studio par exemple) ? je peux le mettre dans une procédure stocké ? (si oui comment merci ?)

    2/ je n’ai pas compris le rôle du $ dans le script …

    Merci d’avance... ce truc est assez urgent merci.

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    A/ je veux savoir d’une manière simple comment créer une procédure stocké (avec un exemple que je peux tester (manager studio) je suis sous SQL server 2005)
    Depuis SSMS sous le noeud Programmability > clic droit sur le noeud Stored procedures > New stored procedure

    Vous disposrez alors d'un template pour pouvoir créer votre procédure


    B/ Je dois faire des développements sur un outil qui utilise BCP

    1/comment tester ce script sans passer par l’inviter commande (dans manager studio par exemple) ? je peux le mettre dans une procédure stocké ? (si oui comment merci ?)

    2/ je n’ai pas compris le rôle du $ dans le script …
    1/Vous pouvez utiliser la procédure stockée xp_cmdshell pour cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TRUNCATE TABLE ...
     
    EXEC master..xp_cmdshell 'bcp .....'
    2/Très probablement une variable ... Regardez comment est utilisé le script

    ++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Par défaut
    merci mikedavem pour votre réponse,

    un template pour pouvoir créer votre procédure
    je veux plusss d'explication, avec un exemple je peux facilement me débloquer... merci

    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
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> 
    	-- Add the parameters for the stored procedure here
    	<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
    	<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
        -- Insert statements for procedure here
    	SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
    END
    GO
    et pour
    xp_cmdshell
    j'exécute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    EXEC master..xp_cmdshell 
    'BCP BD_dev..Int_Prospect_Updates
     IN "E:\BD\DEV\Stage\Int_Contacts_($BATCH_ID).DAT"
     -f"E:\BD\DEV\Source\Format\Int_Prospect_Updates.FMT"
     -e"E:\BD\DEV\Archive\($BATCH_ID)\Log_HHmmss\\Int_Contacts.err"
     -UBD
     -P*********** 
     -m0
     -hTABLOCK'
    y a pas d'erreurs mais rien d'autre ni sur la table ni ailleurs!!!

    Merci

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Par défaut
    Bonjour,
    je suis désolé de mon niveau de SQL server, mais je veux juste créer une procédure stocké, en entrée elle aura le fichier csv a mettre dans la table (BCP).
    heeeeeelp me pliiiiz....

  5. #5
    Invité de passage
    Inscrit en
    Juin 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 1
    Par défaut
    Bonjour

    Voici un exemple concret de la création d'une PS , cette procédure calcule le temps entre 2 dates différentes .

    Si j'ai bien compris votre problématique , il s'agit d'intégré un fichier CSV dans une table , c'est bien ça? si c'est ça votre problème alors il faut passer par un SSIS non pas une PS .

    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
    USE [Dev]
    GO
     
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
     
     
    CREATE PROCEDURE [dbo].[GetTimeLoginTC] (@DateBegin nvarchar(8),@DateEnd nvarchar(8) )
    AS
    BEGIN
     
     
    		declare @Time int
     
    		set  @Time =0
     
    		set @Time=@Time+DATEDIFF(S,@DateBegin,@DateEnd)	
     
     
    RETURN @Time
     
    END
     
    GO

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Par défaut
    Merci nasirus pour votre réponse rapide,

    oui mon problème est d'intégrer un fichier csv dans un table...
    j'ai pas compris pourquoi cela n'est pas possible? y a toujours la fonction BCP?
    donc ce que je veux moi (j'ai jamais écrit une PS!!!) c'est appeler une PS en fournissant le nom du fichier + chemin et quelle fasse le nécessaire (c'est toujours la même table, et c'est un fichier csv séparateur " ; ")

    merci d'avance pour vos explication.

  7. #7
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Une procédure stockée peut suffire dans ce cas là. Dommage d'utiliser SSIS pour une intégration aussi simple.

    Utilisez BULK INSERT dans votre cas.

    Petit exemple (en reprenant à peu près votre modèle :

    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
    CREATE PROCEDURE bcp_insert
    (
     @bcp_file VARCHAR(50),
     @bcp_fmt VARCHAR(50)
    )
    AS
     
    DECLARE @sql VARCHAR(500);
     
    SET @sql = 'BULK INSERT TEST.dbo.T_BCP 
               FROM ''' + @bcp_file + '''
    			WITH 
    			(
    			  FORMATFILE = ''' + @bcp_fmt + ''',
    			  MAXERRORS = 0,
    			  TABLOCK
    			)';
     
    EXEC (@sql);
    ++

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Par défaut
    merci mikedavem,
    Vu que j'ai pas le fameux fichier format FMT!!!
    J'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH
    (
    FIRSTROW=2,
    FIELDTERMINATOR = '\t',
    ROWTERMINATOR = '\n'
    )
    Donc après j'aurai juste à écrire ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC bcp_insert(mon_fichier)

  9. #9
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Oui

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC bcp_insert @mon_fichier
    ++

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE PROCEDURE bcp_to_Temp_VENTES
    ( @bcp_file VARCHAR(500))
    AS 
    DECLARE @sql VARCHAR(500);
     
    SET @sql = 'BULK INSERT test.dbo.Temp_VENTES
               FROM ''' + @bcp_file + '''
                WITH
                (    FIRSTROW=2, 
                    FIELDTERMINATOR =';', 
                    ROWTERMINATOR ='\n')';
    EXEC (@sql);
    Msg 102, Level 15, State 1, Procedure bcp_to_Temp_VENTES, Line 10
    Incorrect syntax near ',
    ROWTERMINATOR ='.
    cela ne fonction pas

    j'ai l'impression qu'il n'aime pas le ";" il pense que c'est la fin de la clause!!!

    bon je vais les passer en paramètres

  11. #11
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Il faut doubler les simple quote dans votre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE PROCEDURE bcp_to_Temp_VENTES
    ( @bcp_file VARCHAR(500))
    AS 
    DECLARE @sql VARCHAR(500);
     
    SET @sql = 'BULK INSERT test.dbo.Temp_VENTES
               FROM ''' + @bcp_file + '''
                WITH
                (    FIRSTROW=2, 
                    FIELDTERMINATOR ='';'', 
                    ROWTERMINATOR =''\n'')';
    EXEC (@sql);
    ++

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Par défaut
    Suuuuper

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Command(s) completed successfully.
    Sinon juste deux derniers point SVP
    1/ quels sont toutes les valeurs qui faut entourer de deux simple cote?
    2/ comment rendre cette PS automatique (se déclenche chaque soir à 19h par exemple) ?
    Merci

  13. #13
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Pour le 1), Mikedavem vous a proposé (à juste titre) de faire cela en écrivant du code SQL dynamique.
    Dès lors, dès que vous devez passer une valeur que vous auriez mise avec un seul quote dans du code SQL non dynamique, vous devez le doubler.
    Faites également attention aux apostrophes

    Si vous voulez voir le code qui sera exécuté ou tout simplement pour débugger, remplacez le EXEC par un PRINT : cela vous affichera la chaîne de requête dans la console de SQL Server Management Studio.

    Pour le 2), il vous suffit de créer un travail dans l'Agent SQL Server, qui est en fait le planificateur de tâches de SQL Server, mais en mieux

    Pour voir comment créer un job, rendez-vous ici, et une fois fait les étapes décrites, faites celles décrite par la rubrique "Procédure : créer une étape de travail Transact-SQL (SQL Server Management Studio)", ce qui vous permettra de spécifier la procédure stockée à appeler.
    Il vous suffit ensuite de planifier le job en suivant les instruction de la rubrique "Procédure : planifier un travail (SQL Server Management Studio)"

    Vous avez la démarche complète décrite ici avec des captures d'écran

    @++

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2008, 09h29
  2. Procédure stockée - bcp et fichier variable
    Par iza76 dans le forum Outils
    Réponses: 2
    Dernier message: 11/04/2008, 08h53
  3. Réponses: 3
    Dernier message: 09/09/2004, 11h31
  4. Procédure stockée : BCP pour sauvegarde d'une base...
    Par Webman dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/09/2004, 11h31
  5. Réponses: 4
    Dernier message: 04/12/2003, 08h12

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