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 leio de volta, fica assim
<xsl:value-of select="name/n/given" />
<xsl:text />
<xsl:value-of select="name/n/family" />
Preste atenção na segunda linha. Este é um problema porque altera como será a saída da transformação XSLT. O primeiro exemplo criará um espaço entre o nome e o sobrenome, enquanto o segundo não criará espaço, portanto será como JohnJohnsen, enquanto o primeiro será como John Johnsen.
Existe alguma maneira de resolver isso?
sql-server
xml
Zach
fonte
fonte
_
ou~
) e substituí-lo por um espaço no momento da apresentação.Respostas:
Você pode usar
xml:space = "preserve"
nos nós em que 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:
Documento completo:
Resultado:
Outra opção para todo o documento é usar converter com o estilo 1 .
fonte
Esta página da documentação do SQL Server diz
Para o seu exemplo, suponho que o espaço em branco da tag do meio não seja significativo e, portanto, livre para refatorar a representação. Eu não acho que haja uma correção para isso; é exatamente como o SQL Server implementa o tipo de dados XML.
As soluções alternativas incluiriam o uso de um marcador de posição em vez do 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. Definitivamente, isso 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ê.
fonte
Você pode agrupar 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 quando o resultado é usado novamenteSELECT
. Felizmente, o espaço é mantido ao reutilizar o resultado de talSELECT
:O resultado será:
fonte