我的表中有这个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)')
没有成功,我在这里试图解决这个简单的查询。 感谢。
答案 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
或将其删除......