Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 Server XML结果中Case语句中的int返回“”_Sql_Sql Server_Xml - Fatal编程技术网

SQL Server XML结果中Case语句中的int返回“”

SQL Server XML结果中Case语句中的int返回“”,sql,sql-server,xml,Sql,Sql Server,Xml,我正在尝试将person表呈现为XML。“我的姓名”字段是一个varchar,而“我的年龄”字段是一个int。每次为NULL时,XML转换都会将其转换为0。我希望它是“”,如果它为NULL,那么XML将跳过该字段 SELECT (SELECT CASE WHEN NAME IS NULL THEN ' ' ELSE NAME END, CASE WHEN AGE IS NULL THEN ' ' ELSE AGE END FROM TA

我正在尝试将person表呈现为XML。“我的姓名”字段是一个varchar,而“我的年龄”字段是一个int。每次为NULL时,XML转换都会将其转换为0。我希望它是“”,如果它为NULL,那么XML将跳过该字段

SELECT (SELECT CASE WHEN NAME IS NULL THEN ' ' ELSE NAME END,
               CASE WHEN AGE IS NULL THEN ' ' ELSE AGE END
               FROM TABLE.PERSONS FOR XML PATH('PERSON'), TYPE)
FOR XML PATH('PERSONS'), TYPE
当年龄为空时,结果为:

<PERSONS>
    <PERSON>
        <NAME>JIM</NAME>
        <AGE>0</AGE>
    </PERSON>
</PERSONS>
我希望它是:

<PERSONS>
    <PERSON>
        <NAME>JIM</NAME>
        <AGE> </AGE>
    </PERSON>
</PERSONS>
“”是varchar,而不是int。因此,在您的案例表达式中,值“”隐式转换为int,因为int的值高于varchar。如果您尝试选择CONVERTint“”;您会注意到返回值为0

您需要将您的年龄转换为varchar:

我还注意到,您的CASE表达式缺少结尾。

''是varchar,而不是int。因此,在您的CASE表达式中,您的值''隐式转换为int,因为int的值高于varchar。如果您尝试选择CONVERTint“”;您会注意到返回值为0

您需要将您的年龄转换为varchar:


我还注意到,您的CASE表达式缺少结尾。

CASE语句查看源列数据类型int,并将空字符串转换为具有更高优先级的数据类型0 int,简单的解决方案是使用子查询将int数据类型转换为字符串,然后使用CASE语句。类似于

SELECT (SELECT CASE WHEN NAME IS NULL THEN ' ' ELSE NAME END Name,
               CASE WHEN AGE IS NULL THEN  ' ' ELSE AGE END  Age
        FROM
        (SELECT NAME , CAST(AGE AS VARCHAR(10)) AS AGE FROM Table.Persons) x
        FOR XML PATH('PERSON'), TYPE)
FOR XML PATH('PERSONS'), TYPE

Case语句查看源列数据typeint并将空字符串转换为具有更高优先级的数据类型0 int,简单的解决方案是使用子查询将int数据类型转换为字符串,然后使用Case语句。类似于

SELECT (SELECT CASE WHEN NAME IS NULL THEN ' ' ELSE NAME END Name,
               CASE WHEN AGE IS NULL THEN  ' ' ELSE AGE END  Age
        FROM
        (SELECT NAME , CAST(AGE AS VARCHAR(10)) AS AGE FROM Table.Persons) x
        FOR XML PATH('PERSON'), TYPE)
FOR XML PATH('PERSONS'), TYPE

如果是2012+,另一个选项是使用NULLIF和Concat

范例

返回


如果是2012+,另一个选项是使用NULLIF和Concat

范例

返回


年龄列的数据类型是什么?INT?是的。在我描述的第二句话中,这是因为当隐式转换为int时,单个空格字符串是0。您必须在查询中将年龄转换为varchar。如果消费应用程序预期年龄为数字,则这可能会导致问题。你也可以考虑,类型,元素XSILIALL 3的答案工作,所以我已经全部投票了。Larnu的是最短路径,所以我选择它作为正确答案。年龄列的数据类型是什么?INT?是的。在我描述的第二句话中,这是因为当隐式转换为int时,单个空格字符串是0。您必须在查询中将年龄转换为varchar。如果消费应用程序预期年龄为数字,则这可能会导致问题。你也可以考虑,类型,元素XSILIALL 3的答案工作,所以我已经全部投票了。拉奴的路是最短的,所以我选择了它作为正确的答案。谢谢你指出缺少的那一头。你的解决方案解决了问题。你比我快,而我正在等待OP回答我在评论中的问题,做得好;谢谢你指出遗漏的结尾。你的解决方案解决了问题。你比我快,而我正在等待OP回答我在评论中的问题,做得好;
Declare @YourTable table (Name varchar(50),Age int)
Insert Into @YourTable values
 ('Jim',0)
,('Jane',null)
,('John',25)

Select Name = IsNull(Name,'')
      ,Age  = concat('',NullIf(Age,0))
 From  @YourTable 
 For XML Path('PERSON'),Root('PERSONS')
<PERSONS>
  <PERSON>
    <Name>Jim</Name>
    <Age></Age>
  </PERSON>
  <PERSON>
    <Name>Jane</Name>
    <Age></Age>
  </PERSON>
  <PERSON>
    <Name>John</Name>
    <Age>25</Age>
  </PERSON>
</PERSONS>