wake-up-neo.net

So fügen Sie die XML-Codierung <? Xml version = "1.0" coding = "UTF-8"?> Zur XML-Ausgabe in SQL Server hinzu

Möglicherweise ein Duplikat unbeantworteter . SQL Server 2008 - XML-Deklaration zur XML-Ausgabe hinzufügen

Bitte lassen Sie mich wissen, ob dies möglich ist. Ich habe in einigen Blogs gelesen 

http://forums.asp.net/t/1455808.aspx/1

http://www.devnewsgroups.net/group/Microsoft.public.sqlserver.xml/topic60022.aspx

Aber ich konnte nicht verstehen, warum ich das nicht tun kann.

19
001priyank

Sie müssen es manuell hinzufügen. SQL Server speichert xml immer intern als ucs-2, sodass es für SQL nicht möglich ist, einen utf-8-Codierungsheader zu generieren

Siehe "Einschränkungen des XML-Datentyps" in MSDN

Die XML-Deklaration PI, beispielsweise <?xml version='1.0'?>, wird beim Speichern von XML-Daten in einer XML-Datentypinstanz nicht beibehalten. Dies ist beabsichtigt. Die XML-Deklaration (<?xml ... ?>) und ihre Attribute (Version/Encoding/Stand-Alone) gehen verloren, wenn Daten in den Typ XML konvertiert werden. Die XML-Deklaration wird als Anweisung an den XML-Parser behandelt. Die XML-Daten werden intern als ucs-2 gespeichert.

35
gbn

Als ich diesen Beitrag las, dachte ich, es wäre das "Ende der Zeile" ... keine Lösung ... Ich hätte den Ansatz fast aufgegeben ... aber tatsächlich gibt es eine Möglichkeit, diese Einschränkung durch Konvertieren des XML-Codes zu umgehen an varchar (max) und hängen die Deklaration an den Anfang der Zeichenfolge an. Der folgende Beitrag zeigt wie:

Verwenden von SQL Server "FOR XML": Konvertieren des Ergebnisdatentyps in Text/varchar/string was auch immer?

Ein einfaches Beispiel würde ungefähr so ​​aussehen:

SELECT 'MY DATA' As MyColumn INTO #MyTable 
SELECT '<?xml version="1.0" encoding="UTF-8"?>' + 
CAST((SELECT MyColumn FROM #MyTable FOR XML PATH('')) AS VARCHAR(MAX)) AS XmlData
DROP TABLE #MyTable 

Die Ausgabe:

<?xml version="1.0" encoding="UTF-8"?>
<MyColumn>MY DATA</MyColumn>
5
MichaelBarce

Die akzeptierte Antwort von "manuell hinzufügen", während technisch korrekt ist, ist unvollständig und daher irreführend. Durch einfaches Hinzufügen der XML-Deklaration mit der gewünschten "Kodierung" wird die tatsächliche Kodierung der Zeichenfolge nicht geändert. Das ist manchmal in Ordnung. Wenn Sie "UTF-8" angeben und die XML-Daten in VARCHAR konvertieren, sind, solange alle der Zeichen Standardzeichen ASCII sind (Werte 1 ... 127), UTF-8 (Zumindest ist kein Unterschied erkennbar). ABER, wenn es any Zeichen mit Werten von 128 oder höher gibt, haben Sie nicht ein UTF-8-kodiertes XML-Dokument. Wenn Sie die XML-Daten in NVARCHAR konvertieren, haben Sie ein UTF-16-kodiertes Dokument, unabhängig davon, was Sie in der XML-Deklaration manuell angeben. Sie sollten nur eine Kodierung angeben, wenn es die tatsächlich verwendete Kodierung ist.

Und bis zu SQL Server 2019 (derzeit in der Betaversion bei CTP 2.1) gab es keine Möglichkeit, die Kodierung in SQL Server als UTF-8 zu definieren, zumindest nicht ohne SQLCLR. In SQL Server 2019 können Sie jetzt XML in UTF-8 konvertieren:

DECLARE @XML XML;
SET @XML = N'<test attr="&#x1F60E;"/>';
SELECT @XML,
       CONVERT(VARBINARY(100), CONVERT(NVARCHAR(MAX), @XML)), -- UTF-16 / UCS-2
       CONVERT(VARBINARY(100),
               CONVERT(VARCHAR(MAX),
                       CONVERT(NVARCHAR(MAX), @XML) COLLATE Latin1_General_100_CI_AS_SC_UTF8)
              ); -- UTF-8

Das kehrt zurück:

Column 1: <test attr="????" />
Column 2: 0x3C007400650073007400200061007400740072003D0022003DD80EDE22002F003E00
Column 3: 0x3C7465737420617474723D223F3F222F3E

Da viele Benutzer noch eine Weile nicht auf SQL Server 2019 sind, ist dies über SQLCLR möglich. Sie können .NET-XML-Klassen (z. B. XmlWriter) verwenden, um dies mit verschiedenen Optionen zu exportieren. Tatsächlich habe ich eine SQLCLR-Funktionsbibliothek SQL # erstellt, die eine solche Funktion enthält: XML_SaveToFile. Mit der Funktion XML_SaveToFile können Sie eine beliebige gültige Codierung angeben. Sie wird dies in der XML-Deklaration festlegen und sicherstellen, dass die Datei mit dieser Codierung gespeichert wird. Es gibt auch Optionen zum Einrücken, für Zeilenumbrüche usw. Nur zur Information: Während in der kostenlosen Version viele Funktionen verfügbar sind, ist XML_SaveToFile nur in der Vollversion (kostenpflichtig) verfügbar.

2
Solomon Rutzky

Ich habe in den letzten Tagen mit diesem Thema gearbeitet, und obwohl es vielleicht bessere Lösungen gibt, bin ich mit diesem Bash-Skript ziemlich zufrieden:

iconv -f UCS-2 -t UTF-8 products.xml > products_utf8.xml
echo "<?xml version='1.0'?>\n<products>\n$(cat products_utf8.xml)\n</products>" > products_utf8_final.xml

Im Grunde erhält dieses Skript eine Datei, die von der schrecklichen bcp-Software generiert wird. Diese generiert unvollständige und ungültige XML-Daten, konvertiert sie vom UCS-2-Format in UTF-8 (erste Zeile) und fügt sie am Anfang und am Ende der Datei hinzu Was benötigt wird (zweite Zeile des Skripts), um gültig und vollständig zu sein.

Für mich geht das. Das Skript, das ich zum Generieren der XML-Datei mit BCP verwendet habe, lautet:

bcp.exe "select * from dat1.dbo.Products FOR XML AUTO,ELEMENTS” queryout "C:\products.xml" -T -w -r -S .\SQLEXPRESS