在SQL Server中检索XML值

时间:2017-01-27 13:21:39

标签: sql-server xml

我的表中有这个XML:

    <?xml version="1.0" encoding="UTF-8"?>
<CompNfse xmlns="http://www.abrasf.org.br/nfse.xsd">
   <Nfse>
      <InfNfse Id="3874269800019313080681500000003">
         <Numero>00000003</Numero>
         <CodigoVerificacao>7999bbbbd</CodigoVerificacao>
         <CodigoControle>{900DA5A9-CBDA-4B62-8DAE-9451FEA34475}</CodigoControle>

我需要检索CodigoControle值。 我试过这段代码没有成功

SELECT CAST(XMLNFE AS XML).value('(CompNfse/Nfse[1]/InfNfse[1]/CodigoVerificacao/node())[1]', 'VARCHAR(max)') 

它的一些变化:

SELECT CAST(XMLNFE AS XML).value('(CompNfse/Nfse[1]/InfNfse[1]/CodigoVerificacao)[1]', 'VARCHAR(max)') 

SELECT CAST(XMLNFE AS XML).value('(CompNfse/Nfse/InfNfse/CodigoVerificacao)[1]', 'VARCHAR(max)')

没有成功,我在这里试图解决这个简单的查询。 感谢。

Examples

1 个答案:

答案 0 :(得分:0)

您的XML声明了一个默认命名空间,但您的SELECT不使用它:

DECLARE @XMLNFE VARCHAR(MAX)=
'<?xml version="1.0" encoding="UTF-8"?>
<CompNfse xmlns="http://www.abrasf.org.br/nfse.xsd">
   <Nfse>
      <InfNfse Id="3874269800019313080681500000003">
         <Numero>00000003</Numero>
         <CodigoVerificacao>7999bbbbd</CodigoVerificacao>
         <CodigoControle>{900DA5A9-CBDA-4B62-8DAE-9451FEA34475}</CodigoControle>
      </InfNfse>
    </Nfse>
</CompNfse>';
WITH XMLNAMESPACES(DEFAULT 'http://www.abrasf.org.br/nfse.xsd')
,Casted AS(SELECT CAST(@XMLNFE AS XML) AS ToXML)
SELECT InfNfse.value('(CodigoVerificacao/text())[1]', 'VARCHAR(max)')
      ,InfNfse.value('(CodigoControle/text())[1]', 'uniqueidentifier')
      ,InfNfse.value('@Id', 'varchar(max)')
FROM Casted
CROSS APPLY ToXml.nodes('/CompNfse/Nfse/InfNfse') AS A(InfNfse)

返回

7999bbbbd   900DA5A9-CBDA-4B62-8DAE-9451FEA34475    3874269800019313080681500000003

顺便说一下

从我的代码中我得知,XML必须被转换为XML(真正的列的数据类型是什么?)。如果可以更改它,则应将XML存储在XML类型的列中。请注意,如果这是在你的控制之下 - 你不应该存储<?xml version="1.0" encoding="UTF-8"?> - 声明。如果您的XML包含非ascii字符,这可能会让您陷入麻烦......将其更改为utf-16或将其删除......