Wstawiam trochę danych XML do kolumny XML na serwerze SQL, ale po wstawieniu danych zostały one zmienione przez serwer SQL. Oto dane, które wstawiam
<xsl:value-of select="name/n/given" />
<xsl:text> </xsl:text>
<xsl:value-of select="name/n/family" />
Kiedy go czytam, wygląda to tak
<xsl:value-of select="name/n/given" />
<xsl:text />
<xsl:value-of select="name/n/family" />
Zwróć uwagę na drugą linię. Jest to problem, ponieważ zmienia sposób wyjścia transformacji XSLT. Pierwszy przykład utworzy spację między imieniem i nazwiskiem, a drugi nie utworzy spacji, więc będzie podobny do JohnJohnsen, a pierwszy będzie jak John Johnsen.
Czy jest jakiś sposób na rozwiązanie tego?
sql-server
xml
Pan Zach
źródło
źródło
_
Lub~
), a następnie zastąpić go spacją w czasie prezentacji.Odpowiedzi:
Możesz użyć
xml:space = "preserve"
w węzłach, w których chcesz zachować miejsce. Używanie xml: space jest „tylko sygnałem intencji”, ale SQL Server jest dla nas miły.Dla jednego węzła
Wynik:
Cały dokument:
Wynik:
Inną opcją dla całego dokumentu jest użycie konwersji ze stylem 1 .
źródło
Ta strona dokumentacji SQL Server mówi
W twoim przykładzie przypuszczam, że uważa on, że biała przestrzeń środkowego znacznika nie jest znacząca i dlatego może dowolnie zmieniać reprezentację. Nie sądzę, żeby można to naprawić; tak właśnie SQL Server implementuje typ danych XML.
Obejścia obejmują obejście zastępcze zamiast białych znaków, jak mówi @Aaron. Konsument musi pamiętać, aby wstawić i usunąć te tokeny. Alternatywnie zdefiniuj kolumnę jako nvarchar zamiast XML. To z pewnością pozwoli zachować całą białą przestrzeń i wszelkie inne formatowanie. Szybki przykład:
Kolumna nvarchar zachowuje format wejściowy, kolumna XML nie.
Utracisz możliwość korzystania z XPATH w zapytaniach SQL. Jeśli XML jest niszczony tylko w aplikacji, jest to nieistotne. Ponadto ciąg znaków można skompresować, oszczędzając miejsce w DB, jeśli jest to dla Ciebie znaczące.
źródło
CDATA
Podczas przechowywania danych możesz owinąć swoje wnętrze:Wygląda na to, że serwer SQL zachowuje wewnętrznie miejsce, ale sam usuwa niepotrzebne
CDATA
znaczniki, gdy odzyskuje wynikSELECT
. Na szczęście przestrzeń jest zachowywana przy ponownym użyciu wyniku takiegoSELECT
:Wynik będzie:
źródło