sql >> データベース >  >> RDS >> Sqlserver

FORXMLの結果にエンコーディング情報を追加する

    @gbnが別の回答 で指摘しているように および別の質問 、"XMLデータは内部にucs-として保存されます。 2 "、およびSQL Serverはデータの生成時にそれを含めません。ただし、XMLを文字列に変換し、XML宣言を最初に手動で追加できます。ただし、宣言でUTF-8を使用するだけでは不正確になります。 SQLが生成するUnicode文字列はUCS-2にあります。たとえば、これは失敗します:

    SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UTF-8"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));
    

    エラーあり:

    一方、これは期待どおりに機能します:

    SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UCS-2"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));
    

    サンプルデータに求める宣言を含む完全なXML文字列を生成するコードは次のとおりです。

    DECLARE @Agents TABLE
    (
        AgentID int,
        AgentName nvarchar(50),
        AgentLocation nvarchar(100)
    );
    INSERT INTO @Agents (AgentID, AgentName, AgentLocation) VALUES (1, N'Mike', N'Sanfrancisco');
    INSERT INTO @Agents (AgentID, AgentName, AgentLocation) VALUES (2, N'John', N'NY');
    
    WITH BaseData AS
    (
        SELECT
            (
                SELECT
                    AgentID AS '@id',
                    AgentName AS 'Name',
                    AgentLocation AS 'Location'
                FROM    @Agents
                FOR     XML PATH('Agent'), ROOT('Agents'), TYPE
            ) AS AgentXML
    ), FullStringTable AS
    (
        SELECT
            *,
            '<?xml version="1.0" encoding="UCS-2"?>' +
            CONVERT(nvarchar(max),AgentXML) AS FullString
        FROM        BaseData
    )
    SELECT
        AgentXML AS OriginalXML,
        FullString,
        CONVERT(xml,FullString) AS FullStringConvertedToXML
    FROM        FullStringTable;
    


    1. Linux用の優れたPostgreSQLクライアントはありますか?

    2. Python、postgresqlでのデータベーステスト

    3. MYSQL:テキストの一部を選択し、ドットの位置に基づいて切り取ります

    4. LAN経由でMySQLデータベースWebサービスにアクセスする方法は?