从SQL处理XML中的空白浮动
问题:当我运行下面的代码时,XML的输出是0.000000000000000e+000,其中的字段是一个浮点数,我希望它是空的,或者因为它是XML,所以根本不显示 想法:我尝试了coalescc.ProductType,以及coalescc.ProductType,'999'我尝试了999以查看发生了什么,但是在这两种情况下,XML提要都没有显示,但是仍然返回值0.000000000000000 e+000 查询:如何处理从SQL创建的XML,其中浮点为空 代码:显示两个节目而不是全部从SQL处理XML中的空白浮动,sql,sql-server,xml,Sql,Sql Server,Xml,问题:当我运行下面的代码时,XML的输出是0.000000000000000e+000,其中的字段是一个浮点数,我希望它是空的,或者因为它是XML,所以根本不显示 想法:我尝试了coalescc.ProductType,以及coalescc.ProductType,'999'我尝试了999以查看发生了什么,但是在这两种情况下,XML提要都没有显示,但是仍然返回值0.000000000000000 e+000 查询:如何处理从SQL创建的XML,其中浮点为空 代码:显示两个节目而不是全部 USE
USE DATABASE
SELECT
e.UPRN
,c.ProductType AS ProductType
FROM TblTable e(NOLOCK)
JOIN
TblAsbestos c (NOLOCK)
ON e.UPRN = c.UPRN
WHERE e.UPRN = 'SH1266'
FOR XML PATH('XML_DATA') , ROOT ('SURVEYDATA')
XML输出:
<SURVEYDATA>
<XML_DATA>
<UPRN>SH1266</UPRN>
<LocationItemPosition>This works</LocationItemPosition>
<SurveyDate>2014-01-16T00:00:00</SurveyDate>
<SurveyCompany></SurveyCompany>
<ProductType>0.000000000000000e+000</ProductType>
</XML_DATA>
</SURVEYDATA>
在c.ProductType周围添加一个
DECLARE @f FLOAT; SET @f = 0
SELECT
'SH1266' as UPRN,
NULLIF(@f, 0.0) AS ProductType
FOR XML PATH('XML_DATA') , ROOT ('SURVEYDATA')
不过,正如肖恩·兰格(Sean Lange)在上文中所评论的那样,对于一个名为ProductType的列来说,float是一种不寻常的数据类型。请看一看在SQL Server 2012上测试过的数据类型,应该从2008年开始使用
DECLARE @tbl TABLE(UPRN VARCHAR(100),ProductType FLOAT);
INSERT INTO @tbl VALUES('valid Float',123.45)
,('Float is zero',0.0)
,('Float is missing',NULL);
SELECT *
FROM @tbl AS tbl
FOR XML PATH('XML_DATA'),ROOT('SURVEYDATA');
/* Result
<SURVEYDATA>
<XML_DATA>
<UPRN>valid Float</UPRN>
<ProductType>1.234500000000000e+002</ProductType>
</XML_DATA>
<XML_DATA>
<UPRN>Float is zero</UPRN>
<ProductType>0.000000000000000e+000</ProductType>
</XML_DATA>
<XML_DATA>
<UPRN>Float is missing</UPRN>
</XML_DATA>
</SURVEYDATA>
*/
SELECT tbl.UPRN
,CAST(tbl.ProductType AS DECIMAL(12,4)) AS ProductType
FROM @tbl AS tbl
FOR XML PATH('XML_DATA'),ROOT('SURVEYDATA');
/* Result with "nicer" numbers, but the empty one is missing...
<SURVEYDATA>
<XML_DATA>
<UPRN>valid Float</UPRN>
<ProductType>123.4500</ProductType>
</XML_DATA>
<XML_DATA>
<UPRN>Float is zero</UPRN>
<ProductType>0.0000</ProductType>
</XML_DATA>
<XML_DATA>
<UPRN>Float is missing</UPRN>
</XML_DATA>
</SURVEYDATA>
*/
SELECT tbl.UPRN
,CAST(tbl.ProductType AS DECIMAL(12,4)) AS ProductType,'' AS ProductType
FROM @tbl AS tbl
FOR XML PATH('XML_DATA'),ROOT('SURVEYDATA');
/* Result, "nicer" numbers and the empty one appears as empty tag.
The trick: There are two elements with the same name and they are concatenated implicitly...
Nothing plus an empty string is: the empty string!
<SURVEYDATA>
<XML_DATA>
<UPRN>valid Float</UPRN>
<ProductType>123.4500</ProductType>
</XML_DATA>
<XML_DATA>
<UPRN>Float is zero</UPRN>
<ProductType>0.0000</ProductType>
</XML_DATA>
<XML_DATA>
<UPRN>Float is missing</UPRN>
<ProductType></ProductType>
</XML_DATA>
</SURVEYDATA>
*/
这是用于哪个RDBMS的?请添加一个标记,以指定您使用的是mysql、postgresql、sql server、oracle还是db2,或者其他完全不同的东西。我不知道为什么有人投票关闭,因为我在Stackoverflow上找不到这一点。如果有答案的链接那就太好了。浮动不能是空的。它可以为NULL或0。如果将空字符串转换为浮点值,它将转换为0。作为旁注,您对查询提示使用了不推荐使用的语法。WITH关键字不再是可选的。一般来说,除非您真的知道自己在做什么,并且已经用尽了所有其他选项,否则应该避免使用查询提示。诺洛克的暗示尤其令人讨厌。我刚注意到你的花车是ProductType。为什么要用浮点数呢?这不应该是一个精确的数字而不是一个近似的数字吗?ProductType需要多少小数位??ProductType不是您所想的,在本例中,字段名是在报表上下文中有意义的事实名称,但是我不想在这里给出所有字段来关注这个问题,否则它会有意义。