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 :

Recopie de procs stocks dynamiques entre serveurs


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    mai 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : mai 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [Résolu] Recopie de procs stocks dynamiques entre serveurs
    Le titre est assez torturé mais mon besoin est assez simple. Je vais quand même prendre le temps de présenter le contexte au cas où l'un de vous ait une idée lumineuse qui fasse que je n'ai plus à me poser cette question.

    Alors voilà: j'ai deux serveurs SQL Server 2000: un de production et l'autre de back-up.

    La synchronisation de ces 2 serveurs se fait de 2 façons distintes et complémentaires:
    • La synchro des données de production est assurée par une alimentation simultanée des deux bases qui tournent en continu.
    • La synchro du paramétrage de l'application cliente de consultation se fait lui par jobs.


    Si cette seconde synchro est parfaite pour la mise à niveau des qqs tables contenant les données de configuration, j'ai un problème en qui concerne des procédures stockées construites dynamiquement depuis l'application cliente et qui font partie intégrante de la configuration (définition de filtre de récupération de données par exemple).

    Toute dynamique qu'elle soit, la création de ces procédures répond à une norme de nommage qui me permet de les identifier facilement et je peux récupérer leur requête de création par la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select 
    c.text
    from dbo.sysobjects o, dbo.syscomments c
    where (OBJECTPROPERTY(o.id, N'IsProcedure') = 1 
    or OBJECTPROPERTY(o.id, N'IsExtendedProc') = 1 
    or OBJECTPROPERTY(o.id, N'IsReplProc') = 1) 
    and o.name like N'CBPC_%' 
    and o.id=c.id
    go
    Je peux lancer cette requête depuis le serveur de back-up vers le serveur de prod pour ainsi récupérer toutes les procs stocks de celui-ci qui m'intéressent.

    En exécutant cette requête dans un curseur je comptais exécuter le contenu c.text.

    Mon problème est alors que le contenu de ce champs n'est généralement pas en une ligne mais en plusieurs.

    Comment lancer l'exécution d'une requête transac-SQL, sur plusieurs lignes, contenue dans un champs text ?


    J'ai essayé ça au début :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    set @request = (select c.ctext from 
                    dbo.sysobjects o, dbo.syscomments c where (OBJECTPROPERTY(o.id, N'IsProcedure') = 1 or OBJECTPROPERTY(o.id, N'IsExtendedProc') = 1 or OBJECTPROPERTY(o.id, N'IsReplProc') = 1) and o.name like N'SXPS_MO_Display_COLOR_CBI' and o.id=c.id)
     
    set @command = 'osql -SmonServeur -UmonUser -PmonPwd -dmaBase -q' + @request
     
    print @command
     
    use master
    exec xp_cmdshell @command
    mais ça ne marche pas car, en gros, il ne retient de ma requête que le "CREATE PROCEDURE tartampion" puis le reste est ignoré

    Je pense que ça ne doit pas être sorcier mais là vraiment je sèche. Des idées qui marchent ???

  2. #2
    Candidat au Club
    Inscrit en
    mai 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : mai 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Pour ceux que j'aurai perdu et qui comprenne mieux la technique (même complétement fausse), je voudrais faire ça :

    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
    -- Déclaration des variables locales
    DECLARE @request  varchar(8000)
    DECLARE @procStockName sysname(128)
     
    -- Récupération de la liste complète des procédures stockées à copier
    DECLARE curseur_ProcStock CURSOR FOR
    SELECT  o.name, c.text
    from [MonServeurDeProdDistant].[laBase].[dbo].[sysobjects] o, [MonServeurDeProdDistant].[laBase].[dbo].[syscomments] c
    where  o.name like N'CBPS_%' 
    and o.id=c.id
     
    -- On se positionne sur le premier élément de la liste
    OPEN curseur_ProcStock
    FETCH NEXT FROM curseur_ProcStock
    INTO @procStockName, @request
     
     
    -- Tant qu'il y a des procédures stockées à copier 
    WHILE @@FETCH_STATUS = 0
    BEGIN
     if exists (select * from [MonServeurDeProdDistant].[laBase].[dbo].[sysobjects] where name = @procStockName)
     begin
       drop procedure @procStockName -- ça déjà ça ne marche pas
     end
      bcp @request queryout test.txt -- et ça encore moins :/
      -- un  'exec xp_cmdshell' avec osql ne marche pas mieux à cause des sauts de ligne dans @request...
     END
     
    -- Fermeture et suppression de la liste
    CLOSE curseur_ProcStock
    DEALLOCATE curseur_ProcStock
     
    GO
    ... manque plus que ça marche ...

  3. #3
    Candidat au Club
    Inscrit en
    mai 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : mai 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bon, ben la solution c'était sp_executesql.

    Source qui marchent pour ceux que cela pourrait intéresser.

    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
    USE BaseBackup
     
    -- Déclaration des variables locales
    DECLARE @request  nvarchar(4000)
    DECLARE @drop  nvarchar(500)
    DECLARE @procStockName sysname
     
    -- Récupération de la liste complète des procédures stockées à copier
    DECLARE curseur_ProcStock CURSOR FOR
    SELECT  o.name, c.text
    from [MonServeurDeProdDistant].[maBase].[dbo].[sysobjects] o, [MonServeurDeProdDistant].[maBase].[dbo].[syscomments] c
    where  o.name like N'SXPS_%' 
    and o.id=c.id
     
    -- On se positionne sur le premier élément de la liste
    OPEN curseur_ProcStock
    FETCH NEXT FROM curseur_ProcStock
    INTO @procStockName, @request
     
     
    -- Tant qu'il y a des procédures stockées à copier 
    WHILE @@FETCH_STATUS = 0
    BEGIN
     -- Execution sur le serveur de backup
     -- Suppression de la procédure stockée si elle existe déjà sur le serveur de backup 
     -- (on l'a remplace au cas où elle est été modifiée)
     if exists (select * from [dbo].[sysobjects] where name = @procStockName)
     begin
       set @drop = 'drop procedure ' + @procStockName
       EXECUTE sp_executesql @drop
     end
      EXECUTE sp_executesql @request
      FETCH NEXT FROM curseur_ProcStock
       INTO @procStockName, @request
    END
    J'ai eu la solution par RawHide de DatabaseJournal.com qui est une URL à mettre dans vos favoris si vous êtes anglophones...

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

Discussions similaires

  1. proc Stockée et SQL serveur VBA
    Par gueguenk dans le forum VBA Access
    Réponses: 1
    Dernier message: 31/01/2009, 16h35
  2. [Proc Stock]Création d'un curseur en SQL dynamique
    Par marsup54 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/06/2006, 14h02
  3. Réponses: 10
    Dernier message: 17/05/2006, 11h50
  4. [SQL_SVR_2K]Proc Stockée Dynamique
    Par Franck2mars dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/05/2006, 10h17
  5. [Procs stockées] [Débutant] Requête dynamique
    Par stailer dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2005, 14h29

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