日期:2014-05-16  浏览次数:20573 次

MS SQLSERVER 关于XML问题
解析一个XML语句
select T.C.value('xm[1]','varchar(20)') as xm,
T.C.value('xb[1]','numeric(8,0)')as xb
from @lxml_str.nodes('//rtcffx') as T(C)

发现如果xb元素没有值, 如:
<xm>张三</xm>
<xb></xb>
则会报错:从数据类型 nvarchar 转换为 numeric 时出错。

因为这里执行的是隐式convert(numeric(8,0),''),所以会报错,
请问有没有好的解决办法,比如如果是''就转换为null
------解决方案--------------------
空字符串本来就不能直接转换为numeric 类型的

你的numeric 没有小数位数,可以考虑直接转换为int类型。
------解决方案--------------------
SELECT  T.C.value('xm[1]', 'varchar(20)') AS xm,
 CAST((T.C.value('(xb/text())[1]', 'NUMERIC(8, 0)')) AS numeric(8,2)) AS xb
FROM    @lxml_str.nodes('//rtcffx') AS T (C)
------解决方案--------------------
先转varchar 再转numeric

select T.C.value('xm[1]','varchar(20)') as xm,
CAST (case when T.C.value('xb[1]','varchar(20)')='' then 0
else  T.C.value('xb[1]','varchar(20)') end as numeric(8,0))as xb
from @lxml_str.nodes('//rtcffx') as T(C)