假设我的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.
请指导我。谢谢
答案 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()
,因为这实际上更快。我建议也将其添加到您的其他专栏中。尤其是如果此查询针对的是(大型)数据集而不是变量。