Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQL处理XML中的空白浮动_Sql_Sql Server_Xml - Fatal编程技术网

从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

问题:当我运行下面的代码时,XML的输出是0.000000000000000e+000,其中的字段是一个浮点数,我希望它是空的,或者因为它是XML,所以根本不显示

想法:我尝试了coalescc.ProductType,以及coalescc.ProductType,'999'我尝试了999以查看发生了什么,但是在这两种情况下,XML提要都没有显示,但是仍然返回值0.000000000000000 e+000

查询:如何处理从SQL创建的XML,其中浮点为空

代码:显示两个节目而不是全部

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不是您所想的,在本例中,字段名是在报表上下文中有意义的事实名称,但是我不想在这里给出所有字段来关注这个问题,否则它会有意义。