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

Bases de données Delphi Discussion :

[10.3.3]Convertir commande mssql


Sujet :

Bases de données Delphi

  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 394
    Par défaut [10.3.3]Convertir commande mssql
    Bonjour

    J'essais de convertir une commande qui est inclus dans MsSql pour l'inclure dans mon programme.
    Je voudrais faire a l'intérieur de mon programme une copie d'une base de donnée MsSql et la renommé dans une autre base sur le même serveur MsSql
    La meilleur méthode est backup de ma table et restore qui ma été suggéré sur le forum MsSql.

    Voici les commandes inclus dans MsSql1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    BACKUP DATABASE BILLET TO DISK = 'C:\00BACK_REST\BACKUP10.BAK'
     
    RESTORE FILELISTONLY  FROM DISK = 'C:\00BACK_REST\BACKUP10.BAK' 
     
    RESTORE DATABASE TestDB13
        FROM DISK = 'c:\00BACK_REST\BACKUP9.bak'  
        WITH MOVE 'billet2015_Data' TO 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\testdb13.mdf',
        MOVE 'billet2015_Log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\testdb13.ldf',
    	 RECOVERY;
    ca fonctionne
    1: je voudrais mettre dans une variable le nom de destination 'C:\00BACK_REST\BACKUP10.BAK'
    2: ecrire en code ces commandes
    J'ai fais beaucoup d'essais voir le code
    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
      MSSQL1.SQL.clear;
       //PARTIE1 ok
       MSSQL1.SQL.Add('BACKUP DATABASE BILLET TO DISK =');
       MSSQL1.SQL.Add(QUOTEDSTR('C:\00BACK_REST\BACKUP11.BAK'));
       //PARTIE2 ok
       MSSQL1.SQL.Add('FILELISTONLY  FROM DISK =');
       MSSQL1.SQL.Add(QUOTEDSTR('C:\00BACK_REST\BACKUP11.BAK'));
       //PARTIE3 problème ici
        MSSQL1.SQL.Add('RESTORE DATABASE TestDB15 FROM DISK =');
        MSSQL1.SQL.Add(QUOTEDSTR('c:\00BACK_REST\BACKUP11.bak'));
        MSSQL1.SQL.Add('WITH MOVE ');
        MSSQL1.SQL.Add(QUOTEDSTR('billet2015_Data'));
        MSSQL1.SQL.Add(' TO ');
        MSSQL1.SQL.Add(QUOTEDSTR('C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\testdb15.mdf ' ));
        MSSQL1.SQL.Add(', MOVE ');
        MSSQL1.SQL.Add(QUOTEDSTR('billet2015_Log'));
        MSSQL1.SQL.Add(', TO ');
        MSSQL1.SQL.Add(QUOTEDSTR('C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\testdb15.ldf ' ));
        MSSQL1.SQL.Add(' RECOVERY ');
     
        MSSQL1.Execute;
        showmessage('BACKUP COMPLÉTER');
    Merci de votre aide

    Mario

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 736
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    MSSQL1 est quel composant ?
    Est-ce que chaque partie a été testée indépendamment ? Je ne vois nulle part une séparation des lignes de commandes
    AMHA la partie qui pose problème : les chemins contenant des espaces.
    Ce que je n'aime pas : la construction du SQL, la non utilisation de paramètres (mais cela dépend du type de composant)

    Avec des informations de versions de Delphi et surtout des sets de composants BDD utilisés (ou disponibles) ce serait plus clair

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 040
    Par défaut
    Ne serait-il pas plus simple d'utiliser une procédure stockée ?

  4. #4
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 394
    Par défaut [10.3.3]Convertir commande mssql
    Bonjour

    Je travaille avec SDAC de DEVART ca va bien J,ai fais des essais avec les commandes integrés et ca fonctionne bien mais j'aurais besoins de mettre des variables dans mes lignes de commandeNom : Mssql1.JPG
Affichages : 661
Taille : 51,9 Ko

    J'aimerais pouvoir mettre dans mon MsSql1 a partir des lignes de code les memes commandes en modifiant le nom des fichiers par une variable.

    Merci de votre aide

    Mario

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 143
    Par défaut
    SDAC propose des Macros, cela sera plus adapté pour ce type de script d'administration que des Params
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 394
    Par défaut [10.3.3]Convertir commande mssql
    Merci ShaiLeTroll

    J'ai fais des essais mais ca fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     // remplacer cette ligne de commande ….BACKUP DATABASE BILLET TO DISK = 'C:\00BACK_REST\BACKUP10.BAK';
     MSSQL1.SQL.clear;
     MSSQL1.SQL.Add('BACKUP DATABASE BILLET TO DISK =');
     MSSQL1.SQL.add('&REP');
     MSSQL1.MacroByName('REP').Value := 'C:\00BACK_REST\TEST2019';
     MSSQL1.Execute;
    J'ai une erreur qui dit syntaxe incorrecte vers 'C:'.

    Merci

    Mario

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 736
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    si SDAC est comme Firedac il y a peut-être plusieurs manières de passer une macro (je pense au asRaw, asIndentifier, asString) qui peuvent dans le cas de Firedac changer pas mal de choses.
    si ce n'est pas le cas, de toute façon, AMHA il manque des guillemets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MSSQL1.MacroByName('REP').Value :=  QuotedStr('C:\00BACK_REST\TEST2019');
    j'ai même un doute en ce qui concerne les chemins contenant des espaces
    il faudra peut-être utiliser les doubles guillemets ou '"C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\testdb13.mdf"' à vérifier

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 143
    Par défaut
    Pourquoi utiliser Add ?
    Cela complique la compréhension du SQL noyé dans le code

    Pour ma part, je mettrais le SQL Brut dans un fichier que je chargerais en ressource,
    C'est plus facile à éditer pour la maintenance qu'une longue chaine mise en constante dans le code source, on y viendra après (surtout en couple avec AsString)

    Pour le moment, commençons par le B.A-BA
    Notez la remarque de SergioMaster sur le typage d'une Macro, c'est différent d'un Param
    Espérons que Value ne soit pas typé et que cela fasse un "remplacé" sans autre ajout
    Sinon, faudra tenter le AsString en retirant les '' un peu partout

    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
    const
      SQL = ' BACKUP DATABASE BILLET TO DISK = ''&BakName'' ' + sLineBreak
          + sLineBreak 
          + ' RESTORE FILELISTONLY  FROM DISK = ''&BakName'' ' + sLineBreak
          + sLineBreak 
          + ' RESTORE DATABASE TestDB13 ' + sLineBreak
          + '     FROM DISK = ''&BakName''  ' + sLineBreak
          + '     WITH MOVE ''billet2015_Data'' TO ''&mdf'', ' + sLineBreak
          + '     MOVE ''billet2015_Log'' TO ''&ldf'', ' + sLineBreak
          + '   RECOVERY; ' ;
    begin
     
      MSSQL1.SQL.Text := SQL; 
      MSSQL1.MacroByName('BakName').Value := 'C:\00BACK_REST\BACKUP10.BAK';
      MSSQL1.MacroByName('mdf').Value := 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\testdb13.mdf';
      MSSQL1.MacroByName('ldf').Value := 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\testdb13.ldf';
      MSSQL1.Execute;
    end;
    TOAD pour Oracle par exemple possede un menu "Make Code", on lui indique le langage et il génére lui le code de const SQL avec les '' et les + tout seul !
    Et il a le "Strip Code" qui fait l'inverse, c'est super pratique pour ce genre de situation
    Comme je suis depuis peu sur SQL Server, un TOAD for SQL Server serait à étudier
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 394
    Par défaut [10.3.3]Convertir commande mssql
    Bonjour

    J'ai essayé le code de ShaiLeTroll et j'ai l'erreur
    Macro BakName not found
    il ne trouve la macro BakName

    Je vais essayé la commande de Sergio et vous informe des résultats

    Merci

    Mario

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 736
    Billets dans le blog
    65
    Par défaut
    Macro BakName not found
    C'est juste un problème dans la constante, j'aurais écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const
      SQL = ' BACKUP DATABASE BILLET TO DISK = &BakName + sLineBreak
          + sLineBreak 
          + ' RESTORE FILELISTONLY  FROM DISK = &BakName + sLineBreak
          + sLineBreak 
          + ' RESTORE DATABASE TestDB13 ' + sLineBreak
          + '     FROM DISK = &BakName'  ' + sLineBreak
          + '     WITH MOVE ''billet2015_Data'' TO &mdf, ' + sLineBreak
          + '     MOVE ''billet2015_Log'' TO &ldf, ' + sLineBreak
          + '   RECOVERY ' ;
    Bien que j'eusse préféré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MSSQL1.Text:='BACKUP DATABASE BILLET TO DISK = &BakName;';
    //MSSQL1.SQL.Add(); équivalent d'un slinebreak
    MSSQL1.SQL.Add('RESTORE FILELISTONLY  FROM DISK = &BakName;');
    //MSSQL1.SQL.Add(); équivalent d'un slinebreak
    MSSQL1.SQL.Add('RESTORE DATABASE TestDB13 ');
    MSSQL1.SQL.Add('FROM DISK = &BakName');
    MSSQL1.SQL.Add('WITH MOVE ''billet2015_Data'' TO &mdf,');
    MSSQL1.SQL.Add('MOVE ''billet2015_Log'' TO &ldf');
    MSSQL1.SQL.Add('RECOVERY;');
    plus facile à déboguer je pense

    Un petit showmessage(MSSQL1.FinalSQL) après assignation des macros devrait permettre de vérifier le SQL final.

    Ce qui reste "choquant" pour moi c'est l'absence de séparateur de commande ( ; ou GO) mais peut-être que SDAC traite un double slinebreak comme tel ?

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 143
    Par défaut
    Citation Envoyé par mario9 Voir le message
    J'ai essayé le code de ShaiLeTroll et j'ai l'erreur

    il ne trouve la macro BakName
    Il doit ignorer les & contenus dans une chaîne du SQL, ce n'est pas déconnant, préférant considéré cela comme du texte que l'on veut utiliser dans le script

    Dans ce cas, essayons AsString (parfait pour une utilisation en mode Ressource)


    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
    const
      SQL = ' BACKUP DATABASE BILLET TO DISK = &BakName ' + sLineBreak
          + sLineBreak 
          + ' RESTORE FILELISTONLY  FROM DISK = &BakName ' + sLineBreak
          + sLineBreak 
          + ' RESTORE DATABASE TestDB13 ' + sLineBreak
          + '     FROM DISK = &BakName  ' + sLineBreak
          + '     WITH MOVE ''billet2015_Data'' TO &mdf, ' + sLineBreak
          + '     MOVE ''billet2015_Log'' TO &ldf, ' + sLineBreak
          + '   RECOVERY; ' ;
    begin
     
      MSSQL1.SQL.Text := SQL; 
      MSSQL1.MacroByName('BakName').AsString:= 'C:\00BACK_REST\BACKUP10.BAK';
      MSSQL1.MacroByName('mdf').AsString:= 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\testdb13.mdf';
      MSSQL1.MacroByName('ldf').AsString:= 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\testdb13.ldf';
      MSSQL1.Execute;
    end;
    Si le AsString ne fonctionne pas du premier coup (c'est à dire ne fait pas son boulot d'ajout des ' )
    Un MSSQL1.MacroByName('BakName').Value := QuotedStr('C:\00BACK_REST\BACKUP10.BAK'); est à essayer





    Si cela fonctionne, je recommande de le faire par Ressource (voir les FAQ à ce sujet)

    Faire un fichier BAK.SQL inclu au projet

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    BACKUP DATABASE BILLET TO DISK = &BakName
     
    RESTORE FILELISTONLY  FROM DISK = &BakName
     
    RESTORE DATABASE TestDB13
      FROM DISK = &BakName 
      WITH MOVE 'billet2015_Data' TO &mdf,
      MOVE 'billet2015_Log' TO &ldf,
      RECOVERY;

    Ajout un fichier BAK.rc au projet (cela ajoutera au DPR {$R 'BAK.res' 'BAK.rc'} )

    Code RC : Sélectionner tout - Visualiser dans une fenêtre à part
    BAK_SQL RCDATA ".\\BAK.SQL"
    Evidemment, le fichier BAK.SQL doit être placé au même niveau que le DPR dans cet exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var
      RS: TResourceStream;
    begin 
      RS := TResourceStream.Create(HInstance, 'BAK_SQL', System.Types.RT_RCDATA);
      try
        MSSQL1.SQL.LoadFromStream(RS);
      finally
         RS.Free();
      end;
      MSSQL1.MacroByName('BakName').AsString:= 'C:\00BACK_REST\BACKUP10.BAK';
      MSSQL1.MacroByName('mdf').AsString:= 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\testdb13.mdf';
      MSSQL1.MacroByName('ldf').AsString:= 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\testdb13.ldf';
      MSSQL1.Execute;
    end;










    Citation Envoyé par SergioMaster Voir le message
    Ce qui reste "choquant" pour moi c'est l'absence de séparateur de commande ( ; ou GO) mais peut-être que SDAC traite un double slinebreak comme tel ?
    Même avec ADO, on peut écrire des SQL sans GO (mais quelque ; ) qui passent avec un ADO sans aucun soucis
    le second avec des ParamByName
    Travaillant en ORACLE précédemment, je suis aussi choqué que la syntaxe du T-SQL

    Un ExecSQL de ce fichier ressource
    Code sql : 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
     
    /*Files\SQL\CREATE.SQL*/
    IF EXISTS (SELECT  TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Z_SP_RELATION_10K')
      DROP TABLE XXX.Z_SP_RELATION_10K
    ;
    IF EXISTS (SELECT  TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Z_SP_DETAIL_10K')
      DROP TABLE XXX.Z_SP_DETAIL_10K
    ;
    IF EXISTS (SELECT  TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Z_SP_MASTER_10K')
      DROP TABLE XXX.Z_SP_MASTER_10K
    ;
     
    CREATE TABLE XXX.Z_SP_MASTER_10K
    (
      M_ID int IDENTITY(1,1) NOT NULL,
      M_NUMBER int NOT NULL,
      M_TEXT nvarchar(50),
      M_ROW int NOT NULL
    ) ON [PRIMARY]
    ;
     
    ALTER TABLE XXX.Z_SP_MASTER_10K 
      ADD CONSTRAINT PK_Z_SP_MASTER_10K PRIMARY KEY CLUSTERED (M_ID)
      WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ;
     
    ALTER TABLE XXX.Z_SP_MASTER_10K SET (LOCK_ESCALATION = TABLE)
    ;
     
     
     
    CREATE TABLE XXX.Z_SP_DETAIL_10K
    (
      D_ID int IDENTITY(1,1) NOT NULL,
      D_NUMBER int NOT NULL,
      D_TEXT nvarchar(50),
      D_ROW int NOT NULL
    ) ON [PRIMARY]
    ;
     
    ALTER TABLE XXX.Z_SP_DETAIL_10K 
      ADD CONSTRAINT PK_Z_SP_DETAIL_10K PRIMARY KEY CLUSTERED (D_ID)
      WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ;
     
    ALTER TABLE XXX.Z_SP_DETAIL_10K SET (LOCK_ESCALATION = TABLE)
    ;
     
     
    CREATE TABLE XXX.Z_SP_RELATION_10K
    (
      M_ID int NOT NULL,
      D_ID int NOT NULL,
      R_NUMBER int NOT NULL,
      R_TEXT nvarchar(50),
      R_ROW int NOT NULL
    ) ON [PRIMARY]
    ;
     
    ALTER TABLE XXX.Z_SP_RELATION_10K 
      ADD CONSTRAINT PK_Z_SP_RELATION_10K PRIMARY KEY CLUSTERED (M_ID, D_ID)
      WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ;
     
    ALTER TABLE XXX.Z_SP_RELATION_10K SET (LOCK_ESCALATION = TABLE)
    ;
     
    ALTER TABLE [XXX].[Z_SP_RELATION_10K]  WITH CHECK ADD  CONSTRAINT [FK_Z_SP_RELATION_MASTER_10K] FOREIGN KEY([M_ID])
    REFERENCES [XXX].[Z_SP_MASTER_10K] ([M_ID])
    ;
     
    ALTER TABLE [XXX].[Z_SP_RELATION_10K] CHECK CONSTRAINT [FK_Z_SP_RELATION_MASTER_10K]
    ;
     
    ALTER TABLE [XXX].[Z_SP_RELATION_10K]  WITH CHECK ADD  CONSTRAINT [FK_Z_SP_RELATION_DETAIL_10K] FOREIGN KEY([D_ID])
    REFERENCES [XXX].[Z_SP_DETAIL_10K] ([D_ID])
    ;
     
    ALTER TABLE [XXX].[Z_SP_RELATION_10K] CHECK CONSTRAINT [FK_Z_SP_RELATION_DETAIL_10K]
    ;


    Un ExecSQL de ce fichier ressource
    Code sql : 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
     
    /*Files\SQL\INSERT.SQL*/
    DECLARE @cpt int = :pStart
    DECLARE @cptD int
    DECLARE @cptM int
    DECLARE @LetterCode nvarchar(50)
     
    DECLARE @IdentityD TABLE (ID int, LC nvarchar(50))  
    DECLARE @IdentityM TABLE (ID int, LC nvarchar(50)) 
     
    WHILE @cpt <= :pEnd
    BEGIN  
      SET @cptD = @cpt
      SET @LetterCode = ''
      WHILE @cptD > 0
      BEGIN
        SET @cptM = @cptD % 26
        IF @cptM = 0 
          SET @cptM = 26
        SET @cptD = (@cptD - 1) / 26
        SET @LetterCode = Char(64 + @cptM) + @LetterCode
      END
      IF @cptD > 0
        SET @LetterCode = Char(64 + @cptD) + @LetterCode
     
      INSERT INTO XXX.Z_SP_MASTER_10K (M_NUMBER, M_TEXT, M_ROW) OUTPUT INSERTED.M_ID, INSERTED.M_TEXT INTO @IdentityM VALUES (@cpt, 'M_' + @LetterCode, @cpt) 
      INSERT INTO XXX.Z_SP_DETAIL_10K (D_NUMBER, D_TEXT, D_ROW) OUTPUT INSERTED.D_ID, INSERTED.D_TEXT INTO @IdentityD VALUES (@cpt, 'D_' + @LetterCode, @cpt) 
     
      SET @cpt = @cpt + 1
    END  
     
    /*Ceci doit être utilisé en modifiant CommandTimeout, compter plus de 30s à partir de 2500x2500*/
    INSERT INTO XXX.Z_SP_RELATION_10K (M_ID, D_ID, R_NUMBER, R_TEXT, R_ROW) 
      SELECT M.ID, D.ID, M.ID + D.ID, M.LC + '_' + D.LC, ROW_NUMBER() OVER(ORDER BY M.ID, D.ID)
      FROM @IdentityM M 
      CROSS JOIN @IdentityD D  
     
    /* Equivalent du INSERT INTO CROSS JOIN ci-dessus 
    DECLARE RelationM CURSOR FOR 
      SELECT M.ID, M.LC  
      FROM @IdentityM M 
      ORDER BY M.ID ASC;
     
    OPEN RelationM
    FETCH NEXT FROM RelationM   
    INTO @cptM, @LetterCode 
     
    SET @cpt = 0
     
    WHILE @@FETCH_STATUS = 0  
    BEGIN 
      
      INSERT INTO XXX.Z_SP_RELATION_10K (M_ID, D_ID, R_NUMBER, R_TEXT, R_ROW)
        SELECT @cptM, D.ID, @cptM + D.ID, @LetterCode + '_' + D.LC, @cpt + ROW_NUMBER() OVER(ORDER BY D.ID ASC)
        FROM @IdentityD D
     
      SET @cpt = @cpt + @@RowCount	
      
      FETCH NEXT FROM RelationM   
      INTO @cptM, @LetterCode 
     
    END
     
    CLOSE RelationM;  
    DEALLOCATE RelationM;  
    */
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 394
    Par défaut [10.3.3]Convertir commande mssql
    Bonjour

    Merci beaucoup pour votre aide ps: Je suis a la solution de la reponse 8 de ShaiLeTroll
    J'étais a analyser les erreurs et que j'ai corrigé avec un mélange de vos réponses.

    voici le code modifié

    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
     
      const
      SQL9 = ' BACKUP DATABASE BILLET TO DISK = &BakName ' + sLineBreak
          + sLineBreak
          + ' RESTORE FILELISTONLY  FROM DISK = &BakName ' + sLineBreak
          + sLineBreak
          + ' RESTORE DATABASE Billet2020 ' + sLineBreak
          + '     FROM DISK = &BakName  ' + sLineBreak
          + '     WITH MOVE ''billet_Data'' TO    &mdf  , ' + sLineBreak
          + '     MOVE ''billet_Log'' TO    &ldf  , ' + sLineBreak
          + '   RECOVERY; ' ;
    begin
     
      MSSQL1.SQL.Text := SQL9;
      MSSQL1.MacroByName('BakName').Value := QuotedStr('C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\Backup\BILLET.bak');
      MSSQL1.MacroByName('mdf').Value  :=QuotedStr('C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\Billet2020.mdf');
      MSSQL1.MacroByName('ldf').Value  := QuotedStr('C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\Billet2020.ldf');
      MSSQL1.Execute;
    end;
    J'ai enlevé les quillements devant les MacroName et ajouter QuotedStr devant l'expression a ajouter .

    J'ai pas erreurs dans le code sauf des erreurs sur les parties du résultats de la commande move parce que quand je créer mon backup je crée un fichier .Bak
    qui ne contient pas les fichier mdf et ldf je cherche la cause de mon erreur et je regarde aussi la suite de SergioMaster (9)et de ShaiLeTroll(10).

    Avant j'utilisais un fichier qui était créer par MsSql server management qui avait les extensions mdf et ldf.

    Merci beaucoup

    Mario

  13. #13
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 394
    Par défaut [10.3.3]Convertir commande mssql (backup-restore)
    Bonjour

    Apres avoir bien vérifié mes bases ca fonctionne avec un mélange de vos suggestions et plusiers essais en mode transac_sql (avec management mssql) Ligne de code par ligne de cote. J'ai réussi en mode programme donc voici le code qui pourrait aidé.

    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
     
    procedure TForm1.B_SergioClick(Sender: TObject);
    begin
    MSSQL1.sql.clear;
     MSSQL1.sql.add('BACKUP DATABASE BILLET2019 TO DISK = &BakName;');
     //MSSQL1.SQL.Add(); équivalent d'un slinebreak
    MSSQL1.SQL.Add('RESTORE FILELISTONLY  FROM DISK = &BakName;');
    //MSSQL1.SQL.Add(); équivalent d'un slinebreak
     MSSQL1.SQL.Add('RESTORE DATABASE billet2035 ');
    MSSQL1.SQL.Add('FROM DISK = &BakName');
    MSSQL1.SQL.Add('WITH MOVE ''billet2019_DATA'' TO &mdf,');
    MSSQL1.SQL.Add('MOVE ''billet2019_Log'' TO &ldf');
    //MSSQL1.SQL.Add('RECOVERY;');   }
     MSSQL1.MacroByName('BakName').Value := QuotedStr('C:\00BACK_REST\BILLET2019.bak');
       MSSQL1.MacroByName('mdf').Value  :=QuotedStr('C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\Billet2035.mdf');
      MSSQL1.MacroByName('ldf').Value  := QuotedStr('C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\Billet2035.ldf');
     
    showmessage(MSSQL1.FinalSQL) ;
     
    mssql1.Execute;
    end;
    Un gros merci a vous deux vous êtes une aide très précieuse qui nous permets d'évoluer dans dans nos projets en nous orientant dans nos recherches.

    Mario

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

Discussions similaires

  1. [PowerShell] convertir commande cURL
    Par aberzen dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 29/01/2020, 22h13
  2. [MsSql-Rad_Studio]Simplifier une commande MsSql
    Par mario9 dans le forum Bases de données
    Réponses: 3
    Dernier message: 22/09/2018, 23h46
  3. Erreur sur commande mssql
    Par alexg57070 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/05/2013, 15h07
  4. Réponses: 18
    Dernier message: 08/02/2004, 23h38

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