sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server:Erstat ugyldige XML-tegn fra et VARCHAR(MAX)-felt

Der er et trick, der bruger den implicitte konvertering af VARBINARY til base64 og tilbage:

Her er din liste over ondskab

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); 

Dette virker

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

Resultatet (nogle er "udskrevet")

�  x17;

Følgende er forbudt

SELECT CAST(@XmlAsString AS XML) 

Men du kan bruge den implicitte konvertering af VARBINARY til base64

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

Resultatet

AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh9/ 

Nu har du din rigtige XML inklusive specialtegnene !

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

Resultatet

�  x18;

  1. SQL vælg alle, hvis parameteren er null, ellers returnerer den specifikke vare

  2. OPDATERINGER til statistik

  3. Den nemme guide til, hvordan du bruger underforespørgsler i SQL Server

  4. SQL Server Database Backup Encryption