在SQL Server XML结果的Case语句中从int返回''

alc*_*or8 1 xml sql sql-server

我正在尝试将人员表格呈现为XML.我的NAME字段是varchar而我的AGE字段是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
Run Code Online (Sandbox Code Playgroud)

结果是当age为NULL时:

<PERSONS>
    <PERSON>
        <NAME>JIM</NAME>
        <AGE>0</AGE>
    </PERSON>
</PERSONS>
Run Code Online (Sandbox Code Playgroud)

我希望它是:

<PERSONS>
    <PERSON>
        <NAME>JIM</NAME>
        <AGE> </AGE>
    </PERSON>
</PERSONS>
Run Code Online (Sandbox Code Playgroud)

Lar*_*rnu 5

' '是一个varchar,而不是一个int.在CASE表达的值' '因此被隐式转换为一个int(如int具有较高的数据类型的优先级varchar).如果你尝试,SELECT CONVERT(int, ' ');你会注意到返回值是0.

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

SELECT (SELECT CASE WHEN NAME IS NULL THEN ' ' ELSE NAME END AS NAME,
               CASE WHEN AGE IS NULL THEN ' ' ELSE CONVERT(varchar(3),AGE) END AS AGE --I assume you no will have the age 1000 (or more)
               FROM TABLE.PERSONS FOR XML PATH('PERSON'), TYPE)
FOR XML PATH('PERSONS'), TYPE;
Run Code Online (Sandbox Code Playgroud)

我也注意到,你的CASE表情错过了他们END的.