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

Développement SQL Server Discussion :

OPENXML et espace en fin de ligne [2014]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 557
    Par défaut OPENXML et espace en fin de ligne
    Bonjour,
    Je suis en train de me rendre compte que la fonction OPEMXML me supprime des espace e fin de noeud

    Par exemple, j'ai ceci dans mon xml : <Revenu><Annee>2015</Annee><Data>5XXXXXXXXXXXXX5 </Data></Revenu>
    Dans ma procédure stockée, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT @Annee = Annee, @Data = Data		
    		FROM   OPENXML(@XMLDataRevenuPointer, '/Revenu',2)	
    		WITH   (	Annee smallint,					
    					Data nvarchar(max))
    En sortie, @Data ne contient pas : -5XXXXXXXXXXXXX5 - mais -5XXXXXXXXXXXXX5-

    => Les espaces de fin ont été supprimé

    Le souci est que je suis censé y stocker le contenu d'une ligne de fichier pour pouvoir les refournir plus tard..
    Le fichier étant un longueur fixe (mais dont la longueur ne dépend pas de moi), je regénère un fichier "erroné"...

    Je précise que la longueur n'est pas de mon ressort pour pas que l'on me réponde de faire l'équivalent dans PadRight..
    Surtout que la longueur est vouée à changer bientôt

    Merci d'avance pour votre aide

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    C'est le comportement normal du standard XML ! les blancs ne sont pas significatifs en fin de données, sauf pour les balises.
    voir : http://usingxml.com/Basics/XmlSpace

    Vous pouvez remplacer vos blancs par l'attribut xml:space.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @XML XML;
    SET @XML = N'<Revenu xml:space="preserve"><Annee>2015</Annee><Data>5XXXXXXXXXXXXX5 </Data></Revenu>'
    SELECT @XML
    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

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    A noter que les espaces sont conservées lors de l'utilisation des méthodes nodes et value :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT	d.value('Data[1]', 'NVARCHAR(MAX)')
    FROM	@XML.nodes('Revenu') T(d)

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 557
    Par défaut
    Bonjour,
    Merci à tous les 2 pour vos réponses

    Que je fasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set @p2=convert(xml,N'<Revenu><Annee>2015</Annee><Data>XXXX000000002         </Data></Revenu>')
    select @p2
    OU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set @p2=convert(xml,N'<Revenu xml:space="preserve"><Annee>2015</Annee><Data>XXXX000000002         </Data></Revenu>')
    select @p2
    Le résultat est le même, les espaces sont conservées

    Jouer avec les Nodes fonctionne mais il me faut revoir un peu la mécanique mais pourquoi pas... (Pas un souci de performance entre les Nodes et l'utilisation de OPEN XML ?)
    Je me disais qu'il doit bien y avoir de continuer à utiliser OPEMXML + WITH

    J'ai essayé vite fait de voir si cela changeait quelque chose en terme de perf et cela semble être identique

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    au niveau des performances, entre OPENXML et nodes il peut en effet y avoir des différences, mais pas toujours au profit de OPENXML.

    Cela dépend de nombreux facteurs : taille du XML, utilisation qui en est faite...
    Les deux méthodes n'ont pas non plus les même incidences sur les plan de requete...

    Bref, la seule solution pour être sûr : tester !

    mais si dans votre cas OPENXML est plus approprié (et pour vous éviter au passage de revoir toute la mécanique ) vous pouvez tricher un peu, et mixer les deux méthodes en extrayant votre noeud Data en XML par OPENXML, et en le passant en VARCHAR par un value dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
    		Annee
    	,	Data.value('.', 'NVARCHAR(MAX)')		
    FROM   
    	OPENXML(@XMLDataRevenuPointer, '/Revenu',2)	
    	WITH   (	
    		Annee smallint,					
    		Data XML
    	)

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 557
    Par défaut
    J'aime bien ce mix des solutions, je n'y avais pas pensé

    Ca fonctionne ainsi...

    Merci

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

Discussions similaires

  1. Espaces en fin de ligne de commentaire Javadoc
    Par sbrisard dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 09/09/2009, 06h26
  2. Lecture d'un fichier et espace de fin de ligne
    Par Toutankharton dans le forum Langage
    Réponses: 3
    Dernier message: 31/05/2009, 07h36
  3. Réponses: 1
    Dernier message: 09/11/2008, 22h32
  4. pb d'espace en fin de ligne bulk insert
    Par zer35 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 21/05/2008, 14h55
  5. Supprimer les espaces en fin de ligne
    Par papyreno dans le forum Eclipse Java
    Réponses: 8
    Dernier message: 21/02/2008, 22h11

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