Estou inserindo alguns dados XML em uma coluna XML no SQL Server, mas depois que os dados foram inseridos, eles foram alterados pelo sql server. Aqui estão os dados que eu insiro
<xsl:value-of select="name/n/given" />
<xsl:text> </xsl:text>
<xsl:value-of select="name/n/family" />
Quando eu li de volta, é assim
<xsl:value-of select="name/n/given" />
<xsl:text />
<xsl:value-of select="name/n/family" />
Preste atenção na segunda linha. Isso é um problema porque altera como será a saída da transformação XSLT. O primeiro exemplo criará um espaço entre dado e nome de família, enquanto o segundo não criará nenhum espaço, então será como JohnJohnsen, enquanto o primeiro será como John Johnsen.
Existe alguma maneira de resolver isso?
Você pode usar
xml:space = "preserve"
nos nós onde deseja manter o espaço. Usar xml:space é "apenas um sinal de intenção", mas o SQL Server é gentil conosco aqui.Para um nó
Resultado:
Todo o documento:
Resultado:
Outra opção para todo o documento é usar converter com estilo 1 .
Esta página da documentação do SQL Server diz
Para o seu exemplo, suponho que considere que o espaço em branco da tag do meio não é significativo e, portanto, é livre para refatorar a representação. Eu não acho que haja uma solução para isso; é apenas como o SQL Server implementa o tipo de dados XML.
As soluções alternativas incluiriam o uso de um espaço reservado em vez de espaço em branco, como diz @Aaron. O consumidor deve se lembrar de inserir e retirar esses tokens. Como alternativa, defina a coluna como nvarchar em vez de XML. Isso definitivamente preservará todo o espaço em branco e qualquer outra formatação. Um exemplo rápido:
A coluna nvarchar preserva o formato de entrada, a coluna XML não.
Você perderá a capacidade de usar XPATH em consultas SQL. Se o XML for fragmentado apenas no aplicativo, isso é irrelevante. Além disso, a cadeia de caracteres pode ser compactada economizando espaço no banco de dados, se isso for significativo para você.
Você pode envolver seu espaço
CDATA
ao armazenar os dados:Parece que o SQL Server mantém o espaço internamente, mas remove a
CDATA
marcação desnecessária ao recuperar o resultado usandoSELECT
. Felizmente, o espaço é mantido ao reutilizar o resultado de talSELECT
:O resultado será: