SQL Server:如何处理从xml中选择数据期间在xml节点中找到的空数据

时间:2018-11-29 11:28:36

标签: sql-server xml

假设我的xml存储在变量中,并且我想以表格格式显示xml数据。所以我触发了这个查询。

Declare @xml xml  

set @Xml='<?xml version="1.0" encoding="utf-8"?>
<TickerBrokerStandardDateLineitem>
  <Ticker />
  <TickerID />
  <TickerBrokerStandardDateLineitemValues>
    <TickerBrokerStandardDateLineitemValue>
      <TabName>xxxxxxxx</TabName>
      <StandardDate>2010 FY</StandardDate>
      <XFundCode>xxxxx</XFundCode>
      <BRTab></BRTab>
      <BRLineItem></BRLineItem>
      <StandardLineItem>aaaaa</StandardLineItem>
      <StandardValue>1608.7</StandardValue>
      <ActualProvidedByCompany>NO</ActualProvidedByCompany>
    </TickerBrokerStandardDateLineitemValue>
    <TickerBrokerStandardDateLineitemValue>
      <TabName>qqqqqqq</TabName>
      <StandardDate>3Q 2018</StandardDate>
      <XFundCode>RD_015</XFundCode>
      <BRTab></BRTab>
      <BRLineItem></BRLineItem>
      <StandardLineItem>ssssss</StandardLineItem>
      <StandardValue></StandardValue>
      <ActualProvidedByCompany>YES</ActualProvidedByCompany>
    </TickerBrokerStandardDateLineitemValue>
  </TickerBrokerStandardDateLineitemValues>
</TickerBrokerStandardDateLineitem>'

SELECT 
    x.Rec.query('./TabName').value('.', 'VARCHAR(MAX)') AS 'TabName',
    x.Rec.query('./StandardDate').value('.', 'VARCHAR(MAX)') AS 'StandardDate',
    x.Rec.query('./XFundCode').value('.', 'VARCHAR(MAX)') AS 'XFundCode',
    x.Rec.query('./BRTab').value('.', 'VARCHAR(MAX)') AS 'BRTab',
    x.Rec.query('./BRLineItem').value('.', 'VARCHAR(MAX)') AS 'BRLineItem',
    x.Rec.query('./StandardLineItem').value('.', 'VARCHAR(MAX)') AS 'StandardLineItem',
    x.Rec.query('./StandardValue').value('.', 'DECIMAL (18, 2)') AS 'StandardValue',
    x.Rec.query('./ActualProvidedByCompany').value('.', 'VARCHAR(MAX)') AS 'ActualProvidedByCompany'   
FROM @xml.nodes('/TickerBrokerStandardDateLineitem/TickerBrokerStandardDateLineitemValues/TickerBrokerStandardDateLineitemValue') as x(Rec)

您可以看到xml属性<StandardValue></StandardValue>在xml中没有值,但是它声明为十进制。因此,我需要在代码中添加哪种更改,以便在<StandardValue></StandardValue>没有数据时,查询将返回0.00作为默认值?

x.Rec.query('./StandardValue').value('.', 'DECIMAL (18, 2)') AS 'StandardValue',行中应该进行什么样的更改

我尝试了这个nullif(0.0,x.Rec.query('./StandardValue').value('.', 'DECIMAL (18, 2)')) AS 'StandardValue',,但没有运气,我得到了 Error converting data type nvarchar to numeric.

的错误

请指导我。谢谢

1 个答案:

答案 0 :(得分:2)

<StandardValue></StandardValue>(或<StandardValue\>)与未出现在XML中的节点StandardValue相同。这意味着StandardValue节点具有varchar''。如果节点没有值(NULL),则最好不要在数据中包含它。

varchar''无法转换为数字数据类型(尝试CONVERT(int,'')CONVERT(decimal(10,2),'')),因此您需要将值返回为varchar。尝试使用:

ISNULL(TRY_CONVERT(decimal(10,2),x.Rec.query('./StandardValue/text()').value('.', 'varchar(11)')),0) AS StandardValue,

请注意,我还添加了text(),因为这实际上更快。我建议也将其添加到您的其他专栏中。尤其是如果此查询针对的是(大型)数据集而不是变量。