2017-12-12 10 views
1

화물 서비스를 보았지만 반환 된 XML을 테이블로 변환 할 수 없습니다.XML을 SQL Server 테이블로 변환

SQL Server 2016에서 this example을 사용하려고했지만 어떤 이유로 작동하지 않습니다. 내가 잘못하고있는 것은 무엇입니까?

나는이 웹 서비스에 대한 쿼리에서 XML 가지고 :
SET @Url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx/CalcPrecoPrazo?'+ 
    'nCdEmpresa='[email protected]+ 
    '&sDsSenha='[email protected]+ 
    '&sCepOrigem='[email protected]+ 
    '&sCepDestino='[email protected]+ 
    '&nVlPeso='[email protected]+ 
    '&nCdFormato='+CONVERT(VARCHAR(20), @nCdFormato)+ 
    '&nVlComprimento='+CONVERT(VARCHAR(20), @nVlComprimento)+ 
    '&nVlAltura='+CONVERT(VARCHAR(20), @nVlAltura)+ 
    '&nVlLargura='+CONVERT(VARCHAR(20), @nVlLargura)+ 
    '&sCdMaoPropria='[email protected]+ 
    '&nVlValorDeclarado='+CONVERT(VARCHAR(20), @nVlValorDeclarado)+ 
    '&sCdAvisoRecebimento='[email protected]+ 
    '&nCdServico='[email protected]+ 
    '&nVlDiametro='+CONVERT(VARCHAR(20), @nVlDiametro)+ 
    '&StrRetorno=xml'; 

    EXEC sp_OACreate 'MSXML2.ServerXMLHttp', @Obj OUTPUT; 
    EXEC sp_OAMethod @Obj, 'open', NULL, 'GET', @Url, FALSE; 
    EXEC sp_OAMethod @Obj, 'send'; 
    EXEC sp_OAGetProperty @Obj, 'responseText', @Response OUTPUT; 
    EXEC sp_OADestroy @Obj; 

    SET @XML = @Response COLLATE SQL_Latin1_General_CP1251_CS_AS 

가 그럼 난 이렇게 노력을하지만 그것은 작동하지 않습니다 :

--Result from frist code 
DECLARE @XML XML = '<cResultado xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/"> 
    <Servicos> 
    <cServico> 
     <Codigo>4014</Codigo> 
     <Valor>17,20</Valor> 
     <PrazoEntrega>3</PrazoEntrega> 
     <ValorMaoPropria>0,00</ValorMaoPropria> 
     <ValorAvisoRecebimento>0,00</ValorAvisoRecebimento> 
     <ValorValorDeclarado>0,00</ValorValorDeclarado> 
     <EntregaDomiciliar>S</EntregaDomiciliar> 
     <EntregaSabado>S</EntregaSabado> 
     <Erro>0</Erro> 
     <MsgErro /> 
     <ValorSemAdicionais>17,20</ValorSemAdicionais> 
     <obsFim /> 
    </cServico> 
    </Servicos> 
</cResultado>'; 

DECLARE @XmlHandle INT, 
     @PrepareXmlStatus INT; 

EXEC @PrepareXmlStatus= sp_xml_preparedocument @XmlHandle OUTPUT, @XML 


SELECT * 
FROM OPENXML(@XmlHandle, '/cResultado/Servicos/cServico', 2) 
    WITH (
    Codigo INT, 
    Valor SMALLMONEY, 
    PrazoEntrega INT, 
    ValorMaoPropria SMALLMONEY, 
    ValorAvisoRecebimento SMALLMONEY, 
    ValorValorDeclarado SMALLMONEY, 
    EntregaDomiciliar VARCHAR(1), 
    EntregaSabado VARCHAR(1), 
    Erro INT, 
    MsgErro VARCHAR(500), 
    ValorSemAdicionais SMALLMONEY, 
    obsFim VARCHAR(500) 
    ) 


EXEC sp_xml_removedocument @XmlHandle 

See the result

답변

1

내가 추천 내장 XQuery 지원을 이전의 오히려 거친 OPENXML 코드 대신 SQL Server에서 사용하는 것이 좋습니다.

<cResultado ..... xmlns="http://tempuri.org/"> 
        *************************** 

당신은 계정에 그를 취할 필요가 :

또한, 당신의 XML 문서에 정의 된 기본 XML 네임 스페이스 존중하지 않습니다!

여기에이 코드를 사용해보십시오 (그리고 당신은 모든 개별 비트와 <cServico> XML 노드의 조각을 반환하도록 확장 할 수 있습니다) :

WITH XMLNAMESPACES(DEFAULT 'http://tempuri.org/') 
SELECT 
    Codigo = XC.value('(Codigo)[1]', 'int'), 
    Valor = XC.value('(Valor)[1]', 'varchar(20)'), 
    PrazoEntrega = XC.value('(PrazoEntrega)[1]', 'int') 
    -- add more expressions like the above for the other sub-elements 
FROM 
    @XML.nodes('/cResultado/Servicos/cServico') AS XT(XC)