2010-09-02 19 views
22

Ciao Sto cercando di inserire alcuni dati XML in una tabella su SQL Server 2008. Tuttavia continuo a ricevere questo errore; analisiINSERT XML in database SQL Server

XML: la linea 1, carattere 39, in grado di cambiare la codifica

Il filemeta colonna di database utilizza il tipo di dati XML, e non ho cambiare la codifica UTF-16 che credo sia necessario per aggiungere dati XML.

INSERT INTO testfiles 
    (filename, filemeta) 
VALUES 
    ('test.mp3', '<?xml version="1.0" encoding="utf-16" standalone="yes"?><!--This is a test XML file--><filemeta filetype="Audio"><Comments /><AlbumTitle /><TrackNumber /><ArtistName /><Year /><Genre /><TrackTitle /></filemeta>'); 

Aiuto, sono bloccato.

NB: Ho creato l'XML con XMLTextWriter.

risposta

28

Sì, ci sono problemi quando si tenta di inserire XML in SQL Server 2008 e XML contiene una riga di istruzioni di codifica.

Io di solito andare in giro usando la funzione CONVERT che mi permette di istruire SQL Server per ignorare queste istruzioni - usare qualcosa di simile:

INSERT INTO testfiles 
    (filename, filemeta) 
VALUES 
    ('test.mp3', CONVERT(XML, N'<?xml version="1.0" encoding="utf-16" standalone="yes"?>......', 2)); 

E 'sicuramente aiutato a ottenere vari roba XML codificato in SQL Server.

Vedere il MSDN docs on CAST and CONVERT - un po 'in basso nella pagina c'è un numero di stili che è possibile utilizzare per CONVERT con XML e alcune spiegazioni su di essi.

+4

+1 questo è probabilmente l'errore più difficile in tutta la storia di SQL XML: miscelazione dichiarazioni di codifica esplicite con la codifica implicita forma derivata dal tipo stringa (ASCII o Unicode). Nessun mortale ha alcuna possibilità contro questo ... –

+1

Opere bellissime grazie mille! – wonea

18

È sufficiente includere N davanti alla stringa XML per renderlo unicode.

INSERT INTO testfiles 
    (filename, filemeta) 
VALUES 
    ('test.mp3', N'<?xml version="1.0" encoding="utf-16" standalone="yes"?><!--This is a test XML file--><filemeta filetype="Audio"><Comments /><AlbumTitle /><TrackNumber /><ArtistName /><Year /><Genre /><TrackTitle /></filemeta>'); 
+0

Sì, questo è tutto ciò che serve per me. Grazie molto! – Richard

0

questo ha funzionato per me senza errori:

DECLARE @input XML = '<?xml version="1.0" encoding="utf-16" standalone="yes"?><!--This is a test XML file--><filemeta filetype="Audio"><Comments /><AlbumTitle /><TrackNumber /><ArtistName /><Year /><Genre /><TrackTitle /></filemeta>' 

INSERT INTO testfiles(filename, filemeta) 
VALUES ('test.mp3',@input);