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

SQL Server:VARCHAR(MAX)フィールドの無効なXML文字を置き換えます

    VARBINARYの暗黙的な変換を使用するトリックがあります base64に戻って:

    ここにあなたの悪のリスト

    DECLARE @evilChars VARCHAR(MAX)=
      CHAR(0x0)
    + CHAR(0x1)
    + CHAR(0x2)
    + CHAR(0x3)
    + CHAR(0x4)
    + CHAR(0x5)
    + CHAR(0x6)
    + CHAR(0x7)
    + CHAR(0x8)
    + CHAR(0x9)
    + CHAR(0xa)
    + CHAR(0xb)
    + CHAR(0xc)
    + CHAR(0xd)
    + CHAR(0xe)
    + CHAR(0xf)
    + CHAR(0x10)
    + CHAR(0x11)
    + CHAR(0x12)
    + CHAR(0x13)
    + CHAR(0x14)
    + CHAR(0x15)
    + CHAR(0x16)
    + CHAR(0x17)
    + CHAR(0x18)
    + CHAR(0x19)
    + CHAR(0x1a)
    + CHAR(0x1b)
    + CHAR(0x1c)
    + CHAR(0x1d)
    + CHAR(0x1e)
    + CHAR(0x1f)
    + CHAR(0x7f);
    

    これは機能します

    DECLARE @XmlAsString NVARCHAR(MAX)=
    (
        SELECT @evilChars FOR XML PATH('test')
    );
    SELECT @XmlAsString;
    

    結果(一部は「印刷」されます)

    <test>&#x00;&#x01;&#x02;&#x03;&#x04;&#x05;&#x06;&#x07;&#x08;    
    &#x0B;&#x0C;&#x0D;&#x0E;&#x0F;&#x10;&#x11;&#x12;&#x13;&#x14;&#x15;&#x16;&#x17;&#x18;&#x19;&#x1A;&#x1B;&#x1C;&#x1D;&#x1E;&#x1F;</test>
    

    以下は禁止されています

    SELECT CAST(@XmlAsString AS XML)
    

    ただし、VARBINARYからbase64への暗黙的な変換を使用できます

    DECLARE @base64 NVARCHAR(MAX)=
    (
        SELECT CAST(@evilChars AS VARBINARY(MAX)) FOR XML PATH('test')
    );
    SELECT @base64;
    

    結果

    <test>AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh9/</test>
    

    これで、特殊文字を含む実際のXMLができました。 !

    SELECT CAST(CAST(@base64 AS XML).value('/test[1]','varbinary(max)') AS VARCHAR(MAX)) FOR XML PATH('reconverted')
    

    結果

    <reconverted>&#x0;&#x1;&#x2;&#x3;&#x4;&#x5;&#x6;&#x7;&#x8;  
    &#xB;&#xC;
    &#xE;&#xF;&#x10;&#x11;&#x12;&#x13;&#x14;&#x15;&#x16;&#x17;&#x18;&#x19;&#x1A;&#x1B;&#x1C;&#x1D;&#x1E;&#x1F;</reconverted>
    


    1. PostgreSql'PDOException'メッセージ'がドライバーを見つけられませんでした'

    2. MariaDBでのSUBTIME()のしくみ

    3. SQL:NULL値のみの列を選択します

    4. PostgreSQLテーブルからINSERTSQLスクリプトとして特定の行をエクスポートします