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 :

transact sql et sqlcmd


Sujet :

MS SQL Server

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut transact sql et sqlcmd
    bonjour,

    j'ai actuellement un .bat qui appelle un script sql qui appelle lui-même plusieurs scripts sql:

    execute.bat :

    SQLCMD -SSERVEUR -ULOGIN -PMDP -i "C:\ScriptPrincipal.sql" -o "C:\CRD_ScriptPrincipal.log" -f i:1252,o:1252
    ScriptPrincipal.sql :
    :r "C:\Scripts\start.sql"
    :r "C:\Scripts\script01.sql"
    :r "C:\Scripts\Script02.sql"
    :r "C:\Scripts\script03.sql"
    :r "C:\Scripts\script04.sql"
    :r "C:\Scripts\script05.sql"
    :r "C:\Scripts\end.sql"
    j'aimerai changer l'execution de mes scripts. Je voudrai pouvoir executer le script01 seulement s'il existe le client A dans ma base de données, puis le script02 seulement s'il existe le client B etc...
    Le script pourrais ressembler à ceci mais il semble qu'on ne peut pas mélanger des instructions transact sql avec des instructions sqlcmd.

    :r "C:\Scripts\start.sql"

    if exists (select * from client where nom='A')
    :r "C:\Scripts\script01.sql"

    if exists (select * from client where nom='B')
    :r "C:\Scripts\Script02.sql"

    if exists (select * from client where nom='C')
    :r "C:\Scripts\script03.sql"

    if exists (select * from client where nom='D')
    :r "C:\Scripts\script04.sql"

    if exists (select * from client where nom='E')
    :r "C:\Scripts\script05.sql"


    :r "C:\Scripts\end.sql"
    Est-ce que quelqu'un aurait une idée sur la façon d'écrire ce type de programme?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if exists (select * from client where nom='E')
       EXEC xp_cmdshell 'SQLCMD.EXE .....';
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    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 : 43
    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,

    Mettez plutôt le test dans le script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    IF NOT EXISTS
    (
    	SELECT	*
    	FROM	dbo.client
    	WHERE	nom = 'A'
    )
    BEGIN
    	RETURN
    END
     
    <Votre script>
    Cela évite notamment d'avoir à activer l'utilisation de la fonctionnalité xp_cmdshell, avec laquelle on peut compromettre l'intégrité des bases de données, mais aussi du serveur qui les héberge

    @++

    @++

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    En ce qui concerne la commande xp_cmdshell, en effet je me retrouve bloquée et donc à devoir activer la fonctionnalité. Et ceci ne m'est pas autorisé sur l'environnement de production.

    J'ai bien pensé mettre le test dans le script mais les scripts contiennent un bon nombre de requêtes, j'y gère des erreurs, j'utilise des begin transaction ... Le but est que le script doit passer dans son entier. si l'on rencontre un problème sur une requête tout est arrêté et un message nous indique que la mis à jour sur la base n'a pas pu être effectuée. La base reste donc dans son état initial.
    J'ai essayé de mettre un if exists juste avant un begin transaction mais ça ne semble pas fonctionné.
    une autre contrainte qui m'a orienté pour mettre le if exists dans un autre script, c'est que je veux éviter que SQL server lise toutes les requêtes s'il n'y a pas un réel besoin, car de ce que j'ai pu y voir jusque maintenant c'est que toutes les requêtes sont stockées en mémoire et me remplisse le fichier .ldf. J'ai des contraintes sur le taille de ce fichier qui me sont imposée.



    Voici un exemple que j'ai essayé d'allégé au maximum pour être clair :


    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
    USE BaseDeDonnees
    GO
     
    SET NOCOUNT ON
    IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#tmpErrors')) DROP TABLE #tmpErrors
    GO
    CREATE TABLE #tmpErrors (Error int)
    GO
    SET XACT_ABORT OFF
    GO
    SET TRANSACTION ISOLATION LEVEL serializable
    GO
     
     
    -- ici j'ai essayé de mettre : IF EXISTS (select * from client where nom='A')
    BEGIN TRANSACTION
    GO
     
     
     
     
    	-- requete 1 : creation d''une table temporaire 
    		IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].TAMPON_table') AND type in (N'U')) DROP TABLE TAMPON_table
    		GO
    		CREATE TABLE TAMPON_table
    		(	OBJET nvarchar(100),
    			ACTION default 0)
    		GO
    		IF @@ERROR<>0 AND @@TRANCOUNT>0 BEGIN ROLLBACK TRANSACTION
    		print ' !! ECHEC A LA CREATION DE LA TABLE TAMPON_Table' END
    		GO
    		IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END
    		GO
     
     
    	-- requete 2 : creation d''une autre table temporaire 
    		IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].TAMPON_table2') AND type in (N'U')) DROP TABLE TAMPON_table2
    		GO
    		CREATE TABLE TAMPON_table2
    		(	OBJET nvarchar(100),
    			ACTION default 0)
    		GO
    		IF @@ERROR<>0 AND @@TRANCOUNT>0 BEGIN ROLLBACK TRANSACTION
    		print ' !! ECHEC A LA CREATION DE LA TABLE TAMPON_Table2' END
    		GO
    		IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END
    		GO
     
    	-- requete 3 à N : je ne les mentionne pas mais ce sont divers requetes de selection, d'update, d'insert etc ... toujours avec le même principe de gestion des erreurs
     
     
     
     
     
    ------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------ GESTION DES ERREURS -------------------------------
    ------------------------------------------------------------------------------------------------------------------
     
    IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION
    GO
    IF @@TRANCOUNT>0 BEGIN
    print ''
    PRINT '		>>>	LA MIS À JOUR A ETE REALISEE AVEC SUCCES <<<'
     
    COMMIT TRANSACTION
    END
    ELSE PRINT '		
    			!! ATTENTION : La tentative de mise à jour  sur la base de donnees a échouée 
     
    			>> AUCUNE MODIFICATION N''EST INTERVENUE SUR LA BASE	<<	'
     
    GO
    DROP TABLE #tmpErrors
    GO
    SET NOCOUNT OFF

    en espérant avoir été clair dans ma problématique

    merci

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    Bonjour,

    est-ce que quelqu'un aurait une autre syntaxe,en évitant d'utiliser xp_cmdshell, que celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IF EXISTS (SELECT * FROM client WHERE nom='E')
       EXEC xp_cmdshell 'SQLCMD.EXE .....';

    Il n'est vraiment pas possible de rester sur une syntaxe (qui ne fonctionne pas) similaire à celle-ci ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if exists (select * from client where nom='A')
    :r "C:\Scripts\script01.sql"

    je n'ai toujours pas résolu mon problème.

    Merci

  6. #6
    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 : 46
    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
    Et pourquoi ne pas intégrer ta logique dans ton script tout simplement ... du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :r "C:\Scripts\script01.sql"
    et dans script01.sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    IF EXISTS (SELECT * FROM client WHERE nom='E')
    RETURN;
     
    -- suite du code
    ...
    ++

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    Merci mais c'est ce qui m'a déjà été donné comme solution par "elsuket" et je vous retourne donc vers la réponse que je lui ai faite.

  8. #8
    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 : 46
    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
    Ok j'ai fait un peu d'écho désolé ...

    Ce que tu veux faire n'est pas possible il faut ruser avec quelque chose comme cela sur le principe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE @verif BIT;
     
    IF EXISTS (SELECT * FROM client WHERE nom='A')
     SET @verif = 1;
    ELSE 
     SET @verif = 0;
     
    :SETVAR VERIF @verif
     
    :r "C:\Scripts\script01.sql"
    ... et dans le script script01.sql tu peux récupérer la valeur de ta variable VERIF de cette manière

    ... au final je pense que cela revient au même que d'embarquer le IF EXISTS (SELECT * FROM client WHERE nom='A'). Je testerai dès que j'aurai un SQL sous la main.

    ++


    ++

Discussions similaires

  1. Réduction du Journal de transactions SQL Server
    Par Aki dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/10/2004, 09h15
  2. [JDBC][Access] Transaction SQL sur MS Access?
    Par Twofy dans le forum JDBC
    Réponses: 2
    Dernier message: 19/08/2004, 14h46
  3. Transact Sql : Conversion de variable
    Par lord_paco dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/08/2003, 13h25
  4. Conversion de SQL à Transact-SQL
    Par sebioni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/07/2003, 11h59
  5. - fonction Transact-SQL...
    Par korrigann dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/05/2003, 15h00

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