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 :

MSSQL 2000 : OPENXML Dynamique


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut MSSQL 2000 : OPENXML Dynamique
    Bonjour à tous,

    Je souhaiterai savoir s'il est possible d'effectuer des requêtes dynamiques en utilisant la syntaxe OPENXML.

    En effet, je suis en train de réaliser une procédure stockée générique qui me permet de récupérer dynamiquement ma liste des champs et leurs types. Je crée ensuite une chaîne servant dans la partie WITH de OPENXML.

    Exemple du code de ma procédure :
    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
     
     
    CREATE PROCEDURE USP_TEST_MAJ_GENE_V01 
     
    @IDTRAIT INT,
    @FLUX TEXT
     
     AS
     
    DECLARE @IDOC INT
    DECLARE @NOM_CHAMP VARCHAR(255)
    DECLARE @TYPE_CHAMP VARCHAR(255)
    DECLARE @CLE TINYINT
    DECLARE @XML_DEF VARCHAR(4000)
    DECLARE @TEST VARCHAR(8000)
     
    SET @XML_DEF=''
     
    DECLARE TEST_CURSOR CURSOR FOR SELECT NOM_CHAMP,TYPE_CHAMP,CLE_RECHERCHE FROM T_MAJ_FORMAT_FIC WHERE ID_MAJ=@IDTRAIT
    OPEN TEST_CURSOR
    FETCH NEXT FROM TEST_CURSOR INTO @NOM_CHAMP,@TYPE_CHAMP,@CLE
    WHILE @@FETCH_STATUS = 0
    BEGIN
    	SET @XML_DEF = @XML_DEF+@NOM_CHAMP+' '+@TYPE_CHAMP+',' 
    	FETCH NEXT FROM TEST_CURSOR INTO @NOM_CHAMP,@TYPE_CHAMP,@CLE
    END
    CLOSE TEST_CURSOR
    DEALLOCATE TEST_CURSOR
     
    SET @XML_DEF = LEFT(@XML_DEF,LEN(@XML_DEF)-1)
    PRINT @XML_DEF
     
    -- Create an internal representation of the XML document.
    EXECUTE sp_xml_preparedocument @IDOC OUTPUT, @FLUX
    EXECUTE('SELECT * FROM OPENXML ('+CONVERT(VARCHAR(10),@IDOC)+', ''/RACINE_MAJ/ELEMENT'',1) WITH ('+@XML_DEF+')')
    /*SET @TEST =  'SELECT * FROM OPENXML('+CONVERT(VARCHAR(10),@IDOC)+',''/RACINE_MAJ/ELEMENT'',1) WITH('+@XML_DEF+')'
    PRINT @TEST
    EXECUTE(@TEST)
    */
    --SELECT * FROM OPENXML(@IDOC,'/RACINE_MAJ/ELEMENT',1)
    EXECUTE  sp_xml_removedocument @IDOC
    Mon seul soucis est que je ne peux pas utiliser directement la valeur de ma variable @IDOC dans ma requête dynamique. En effet, une erreur est généré lorsque je souhaite enregistrer ma procédure.

    Erreur 156 : Syntaxe incorect vers le mot clé CONVERT

    J'ai essayé de faire sans le CONVERT, c'est-à-dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXECUTE('SELECT * FROM OPENXML ('+@IDOC+', ''/RACINE_MAJ/ELEMENT'',1) WITH ('+@XML_DEF+')')
    A ce moment, il n'y a pas d'erreurs à l'enregitrement de la procédure. Mais une erreur est levée lors de l'exécution de ma procédure stockée.
    Serveur : Msg 170, Niveau 15, État 1, Ligne 1
    Ligne 1 : syntaxe incorrecte vers '1'.

    Je vous demande donc de l'aide afin de pouvoir passer cette requête en dynamique. Une fois que jepourrai exécuter des requêtes dynamiques avec OPENXML, je pourrai passer à l'étape d'enrichissement des tables via des UPDATE ... FROM et INSERT ... SELECT...

    En vous remerciant de votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    hello,

    est-ce que le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /*SET @TEST =  'SELECT * FROM OPENXML('+CONVERT(VARCHAR(10),@IDOC)+',''/RACINE_MAJ/ELEMENT'',1) WITH('+@XML_DEF+')'
    PRINT @TEST
    */
    affiche une ligne de commande bien formée ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Oui.

    Mais j'ai trouvé une solution à mon problème. J'utilise des tables temporaires globales et locales. Pour faire simple :
    - je crée dynamiquement une table temporaire globale avec les champs que je souhaite récupérer + un champ ID

    - J'effectue le OPEN XML dans une table temporaire locale sans le WITH
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * INTO #TEMPO FROM OPENXML(@IDOC,'/ROOT',2)
    - Ensuite je reforme la table de bord résultat dans une seconde table temporaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT LIB.parentid,LIB.localname,VAL.text INTO #TEMPO_2  FROM (SELECT * FROM #TEMPO WHERE parentid<>0 and nodetype=1) LIB,(SELECT * FROM #TEMPO  WHERE nodetype=3) VAL
    WHERE LIB.id=VAL.parentid
    - Je crée un curseur pour charger de manière distinct chaque parentid

    - Je crée un autre curseur pour mettre à jour mes champs en fonction de leur parentid.


    C'est un peu tordu mais j'arrive à faire quelques choses de relativement dynamique.



    Ensuite

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

Discussions similaires

  1. [MSSQL 2000] Pivot dynamique
    Par Dark Matter dans le forum Langage SQL
    Réponses: 10
    Dernier message: 19/02/2008, 10h30
  2. [MSSQL 2000] Pivot dynamique
    Par Dark Matter dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 23/02/2006, 16h59
  3. [MsSQL 2000]Conversion heure GMT
    Par prophetky dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/08/2005, 17h27
  4. Import de structure d'index d'ORACLE à MSSQL 2000
    Par vincentvouthier dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 17h11
  5. [MSSQL 2000]Copie de tout le data
    Par royrremi dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/11/2004, 09h26

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