Converter o texto em xml e inserir um servidor de Sql

temos uma tabela de bases de dados SQL Server 2008 R2 com XML armazenada numa coluna de VARCHAR tipo de dados.

Agora tenho de ir buscar alguns dos elementos do xml.

Então eu quero primeiro converter o xml armazenado como um tipo de dados VARCHAR, para um xml armazenado como xml tipo de dados.

exemplo:

Tabela A

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

Quadro B

Id(int), ProductXML(XML)

quero converter o ProductXML de Table A para um tipo de dados XML e inserir em Table B.

Eu tentei usar o ... CAST() e CONVERT() função abaixo indicada:

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

de forma semelhante tentei converter, mas eu recebo um erro

Processamento em XML: não é possível mudar a codificação

existe alguma forma de converter os itens varchar na tabela em itens XML ?

sobre o XML: é enorme com muitos nós, e a sua estrutura muda dinamicamente.

exemplo : uma linha pode ter uma entrada em XML para um produto e outra linha pode ter uma entrada em xml para múltiplos produto.

Author: marc_s, 2013-04-11

2 answers

Dê-nos uma amostra do seu XML, pois tudo isto funcionaria:

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

Também você pode ter que lançá-lo para nvarchar ou varbinary em primeiro lugar (a partir da documentação da Microsoft):

Você pode processar qualquer um dos tipos de dados de string do servidor SQL, como [n][var]char, [N]text,varbinary e image, para o tipo de dados xml, moldando (CAST) ou convertendo (converter) a string para o tipo de dados xml. O XML não tipado é verificado para confirmar que está bem formado. Se existir um esquema associado ao xml tipo, validação também é realizada. Para mais informações, consulte Comparar XML digitado com XML não tipado.

Os documentos XML podem ser codificados com codificações diferentes (por exemplo, UTF-8, UTF-16, windows-1252). O seguinte descreve as regras de como a string e os tipos de código binário interagem com a codificação do documento XML e como o analisador se comporta.

Uma vez que nvarchar assume uma codificação unicode de dois bytes como UTF-16 ou UCS-2, o analisador XML irá tratar o valor do texto como um duplo byte Documento ou fragmento de XML codificado em Unicode. Isto significa que o documento XML precisa ser codificado em uma codificação Unicode de dois bytes, bem como ser compatível com o tipo de dados fonte. Um documento XML codificado em UTF-16 pode ter uma marca de ordem de byte UTF-16 (BOM), mas não precisa, uma vez que o contexto do tipo de fonte deixa claro que ele só pode ser um documento codificado em Unicode de dois bytes.

O conteúdo de uma cadeia de caracteres varchar é tratado como um documento/fragmento XML codificado por um byte pelo XML analisador. Desde o varchar fonte de seqüência de caracteres tem uma página de código associado, o analisador irá usar a página de código para a codificação se não explícita de codificação é especificado em XML propriamente dito, Se uma instância de XML tem um BOM ou uma declaração de codificação, o BOM ou declaração deve ser consistente com a página de código, caso contrário, o analisador irá reportar um erro.

O conteúdo do varbinary é tratado como um fluxo de codepoint que é passado directamente para o analisador XML. Assim, o documento ou fragmento XML necessita de forneça o BOM ou outra informação de codificação incorporada. O analisador só irá olhar para o fluxo para determinar a codificação. Isto significa que o UTF-16 codificado XML precisa fornecer o UTF-16 BOM e uma instância sem BOM e sem uma codificação de declaração será interpretado como UTF-8.

Se a codificação do documento XML não for conhecida antecipadamente e os dados forem passados como string ou dados binários em vez de dados XML antes de serem lançados para XML, recomenda-se tratar os dados como varbinary. Para exemplo: ao ler dados de um arquivo XML usando OpenRowset (), deve-se especificar os dados a serem lidos como um valor varbinary(max):

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

O servidor SQL representa internamente XML numa representação binária eficiente que usa a codificação UTF-16. A codificação fornecida pelo Usuário não é preservada, mas é considerada durante o processo de processamento.

Solução:

CONVERT(XML, CONVERT(NVARCHAR(max), ProductXML))
 15
Author: Darek, 2013-04-11 19:11:28
Isto funcionou comigo.
select CAST(REPLACE(CAST(column3 AS NVARCHAR(MAX)),'utf-8','utf-16') AS XML) from table
 2
Author: DubMan, 2017-12-20 14:07:58