如何在SELECT FOR XML语句的AS中使用列值

时间:2016-06-14 15:47:50

标签: sql-server xml tsql select

我已将此样本减少到绝对必要的最小值。所以我知道,它没有意义: - )

我知道,我可以使用以下查询从表中选择XML:

select id as [Direction/@Id],
        direction  as [Direction]
from devicepdo
for xml path('')

结果如下:

<Direction Id="1">I</Direction>
<Direction Id="2">O</Direction>``
<Direction Id="3">I</Direction>
<Direction Id="4">O</Direction>
....

列方向始终包含I或O,我想根据列值更改封闭的XML标记。

我的结果应如下所示:

<In Id="1">I</In>
<Out Id="2">O</Out>``
<In Id="3">I</In>
<Out Id="4">O</Out>
....

我试图在&#34; AS&#34;中使用变量或列。条款失败。

在我的查询中,&#34; 方向&#34; in&#34; as [ Direction / @ Id]&#34;应根据列值变化。

这可能吗?任何提示或想法?

1 个答案:

答案 0 :(得分:3)

如果所有属性都为null,并且内容为null,则不会生成任何标记。您可以根据每行中的值使用此事实生成不同类型的标记。

 select 
  -- If direction is I then generate an In tag
  case when direction = 'I' then id else null end as [In/@Id],
  case when direction = 'I' then direction else null end as [In],
  -- If direction is O then generate an Out tag
  case when direction = 'O' then id else null end as [Out/@Id],
  case when direction = 'O' then direction else null end as [Out]
 from devicepdo
 for xml path('')

实际上,您有所有可能标记的表达式,但对于不需要标记类型的行,请使用case语句使表达式为null。