2013-04-11 2 views
4

Nous avons une table de base de données SQL Server 2008 R2 avec XML stocké dans une colonne de type de données VARCHAR.Convertir une chaîne en XML et insérer Sql Server

Je dois maintenant aller chercher certains des éléments du XML. Donc je veux d'abord convertir le xml stocké en tant que type de données VARCHAR, à un xml stocké en tant que type de données xml.

Exemple:

Tableau A

Id(int) , ProductXML (varchar(max)) 

Tableau B

Id(int), ProductXML(XML) 

Je veux convertir le ProductXML de Table A en type de données XML et insérer dans Table B.

J'ai essayé d'utiliser la CAST() et CONVERT() fonction comme indiqué ci-dessous:

insert into TableB (ProductXML) 
select CAST(ProductXML as XML) from TableA; 

De même essayé de convertir, mais je reçois une erreur

XML Parsing: impossible de passer encodant

Est-il possible de convertir les entrées varchar dans le tableau en entrées XML? A propos du XML: il est énorme avec beaucoup de nœuds, et sa structure change dynamiquement. Exemple: Une ligne peut avoir une entrée XML et 1 pour un produit et une autre ligne peut contenir une entrée xml pour plusieurs produits.

Répondre

12

Donnez-nous un échantillon de votre XML tout cela fonctionnerait:

CONVERT(XML, '<root><child/></root>') 
CONVERT(XML, '<root>   <child/>   </root>', 1) 
CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>' AS XML) 

Aussi, vous pourriez avoir à jeter à nvarchar ou varbinary première (de la documentation Microsoft):

Vous pouvez analyser tout des types de données de chaîne SQL Server, tels que [n] [var] char, [n] text, varbinary et image, dans le type de données xml par conversion (CAST) ou conversion (CONVERT) de la chaîne en type de données xml . Le code XML non typé est vérifié pour confirmer qu'il est bien formé. S'il existe un schéma associé au type xml, la validation est également effectuée. Pour plus d'informations, consultez Comparaison de XML typé à XML non typé.

Les documents XML peuvent être codés avec différents codages (par exemple, UTF-8, UTF-16, Windows-1252). Ce qui suit décrit les règles sur la façon dont les types de chaîne et de source binaire interagissent avec le codage de document XML et comment l'analyseur se comporte. Dans la mesure où nvarchar suppose un codage Unicode à deux octets, tel que UTF-16 ou UCS-2, l'analyseur XML traitera la valeur de chaîne comme un document ou fragment XML codé Unicode à deux octets. Cela signifie que le document XML doit être codé dans un codage Unicode de deux octets pour être compatible avec le type de données source. Un document XML codé en UTF-16 peut avoir une marque d'ordre d'octet (BOM) UTF-16, mais il n'en a pas besoin puisque le contexte du type source indique clairement qu'il ne peut s'agir que d'un document codé Unicode à deux octets.

Le contenu d'une chaîne varchar est traité comme un document/fragment XML codé sur un octet par l'analyseur XML. Comme la chaîne source varchar a une page de code associée, l'analyseur utilisera cette page de code pour le codage si aucun codage explicite n'est spécifié dans le XML lui-même. Si une instance XML a une nomenclature ou une déclaration de codage, la nomenclature ou la déclaration doit être compatible avec la page de code, sinon l'analyseur rapportera une erreur.

Le contenu de varbinary est traité comme un flux de code qui est transmis directement à l'analyseur XML. Ainsi, le document ou le fragment XML doit fournir la nomenclature ou d'autres informations de codage en ligne. L'analyseur ne regarde que le flux pour déterminer l'encodage. Cela signifie que XML codé UTF-16 doit fournir la nomenclature UTF-16 et une instance sans nomenclature et sans codage de déclaration sera interprétée comme UTF-8.

Si le codage du document XML n'est pas connu à l'avance et que les données sont transmises sous forme de chaîne ou de données binaires au lieu de données XML avant conversion au format XML, il est recommandé de traiter les données comme varbinary. Par exemple, lors de la lecture des données à partir d'un fichier XML à l'aide OpenRowset(), on doit spécifier les données à lire comme une valeur varbinary (max):

select CAST(x as XML) 
from OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x) 

SQL Server représente en interne XML dans une représentation binaire efficace qui utilise Encodage UTF-16. Le codage fourni par l'utilisateur n'est pas conservé mais est pris en compte lors du processus d'analyse.

Solution:

CONVERT(XML, CONVERT(NVARCHAR(max), ProductXML)) 
+0

Merci! Je suis toujours en train de parcourir tout ce que vous avez écrit. Le xml change réellement dynamiquement. Il peut contenir des informations XML pour un seul produit ou plusieurs produits. Je viens de donner un exemple ci-dessus. En réalité, il s'agit d'une table de journalisation avec différentes données de journalisation (xml) stockées dans la table. – CodeNinja

+0

Quel est le codage de la base de données? – Darek

+0

Je suis désolé, je suis nouveau à ce sujet. J'ai couru la commande suivante que j'ai trouvée en ligne pour trouver l'encodage de base de données SELECT DATABASEPROPERTYEX ('DBName', 'Collation') SQLCollation; et j'ai 'SQL_Latin1_General_CP1_CI_AS' c'est ce que vous avez demandé? – CodeNinja

1

Cela a fonctionné pour moi:

select CAST(REPLACE(CAST(column3 AS NVARCHAR(MAX)),'utf-8','utf-16') AS XML) from table