J'insère des données XML dans une colonne XML dans SQL Server mais une fois les données insérées, elles ont été modifiées par SQL Server. Voici les données que j'insère
<xsl:value-of select="name/n/given" />
<xsl:text> </xsl:text>
<xsl:value-of select="name/n/family" />
Quand je le relis, ça ressemble à ça
<xsl:value-of select="name/n/given" />
<xsl:text />
<xsl:value-of select="name/n/family" />
Faites attention à la deuxième ligne. Il s'agit d'un problème car il change la façon dont la sortie de transformation XSLT sera. Le premier exemple créera un espace entre le prénom et le nom de famille, tandis que le second ne créera aucun espace, donc ce sera comme JohnJohnsen, tandis que le premier sera comme John Johnsen.
Existe-t-il un moyen de résoudre ce problème?
sql-server
xml
Mr Zach
la source
la source
_
ou~
), puis le remplacer par un espace au moment de la présentation.Réponses:
Vous pouvez utiliser
xml:space = "preserve"
sur les nœuds où vous souhaitez conserver l'espace. Utiliser xml: space n'est "qu'un signal d'intention" mais le serveur SQL est bon pour nous ici.Pour un nœud
Résultat:
Document entier:
Résultat:
Une autre option pour le document entier consiste à utiliser la conversion avec le style 1 .
la source
Cette page de la documentation de SQL Server indique
Pour votre exemple, je suppose qu'il considère que l'espace blanc de la balise du milieu n'est pas significatif et est donc libre de refactoriser la représentation. Je ne pense pas qu'il y ait de solution à cela; c'est simplement la façon dont SQL Server implémente le type de données XML.
Les solutions de contournement consisteraient à utiliser un espace réservé au lieu d'un espace blanc comme le dit @Aaron. Le consommateur ne doit pas oublier d'insérer et de retirer ces jetons. Vous pouvez également définir la colonne comme nvarchar au lieu de XML. Cela préservera certainement tout l'espace blanc et tout autre formatage. Un exemple rapide:
La colonne nvarchar conserve le format d'entrée, contrairement à la colonne XML.
Vous perdrez la possibilité d'utiliser XPATH dans les requêtes SQL. Si le XML n'est déchiqueté que dans l'application, cela n'a pas d'importance. De plus, la chaîne de caractères peut être compressée en économisant de l'espace dans la base de données, si cela est important pour vous.
la source
Vous pouvez envelopper votre espace
CDATA
lors du stockage des données:Il semble que SQL Server conserve ensuite l'espace en interne, mais supprime le
CDATA
balisage inutile lui-même lors de la récupération du résultat à l'aideSELECT
. Heureusement, l'espace est conservé lors de la réutilisation du résultat d'un telSELECT
:Le résultat sera:
la source