2015-08-28 138 views
1

我在查询的选择块,从表中挑出行的信号并输出​​XML下面的代码:SQL服务器“到XML”标记名称

select ... 
     ... 
,substring(
     (
      Select RC_1.Master_Code AS [TopographyTDR] 
      From apex.Histo_Result_Coding as RC_1 
      Where RC_1.Histo_Report = Histo_Result_Coding.Histo_Report 
      ORDER BY RC_1.Histo_report 
      For XML auto 
     ), 1, 1000) [TDRCodes] 
     ... 

,这提供了一种类似于输出如下所示:

<RC_1 TopographyTDR="T77100"/><RC_1 TopographyTDR="T77100"/> 
<RC_1 TopographyTDR="T01000"/><RC_1 TopographyTDR="T01000"/> 
<RC_1 TopographyTDR="EGFR "/> <RC_1 TopographyTDR="GHER2"/> 
<RC_1 TopographyTDR="T04020"/><RC_1 TopographyTDR="T04020"/> 
<RC_1 TopographyTDR="T77100"/><RC_1 TopographyTDR="T77100"/> 

这是正确的数据,但我需要标记为'TopographyTDR',而不需要RC_1。即数据应该如下:

<TopographyTDR="T77100"/><TopographyTDR="T77100"/> 
<TopographyTDR="T01000"/><TopographyTDR="T01000"/> 
<TopographyTDR="EGFR "/> <TopographyTDR="GHER2"/> 
<TopographyTDR="T04020"/><TopographyTDR="T04020"/> 
<TopographyTDR="T77100"/><TopographyTDR="T77100"/> 

有没有简单的方法来做到这一点?即避免让表名出现在XML标签文本中?

在此先感谢。

回答

2

可以使用for xml path代替for xml auto,并明确指定标签名称。

喜欢的东西:

Select RC_1.Master_Code AS 'TopographyTDR' 
From apex.Histo_Result_Coding as RC_1 
Where RC_1.Histo_Report = Histo_Result_Coding.Histo_Report 
ORDER BY RC_1.Histo_report 
for XML path('') 

更新:

在您需要的输出寻找更准确 - 它不会看起来像有效的XML。

尽管失踪根节点(它可以为简单起见被省略,我想),这种格式具有根本的问题是:标签像<TopographyTDR="T77100"/>其实不具有标签名但只有属性TopographyTDR具有价值T77100。你确定你想要这样的伪XML数据?

+0

你没有更精确地看过其他的答案:-)不要紧......不,为了简单起见不可省略根节点。如果有很多项目,则必须有一个根节点才能有效! – Shnugo

+0

通过“为了简化省略”我的意思是“省略了问题”,“在真正的XML数据”不。 –

1

你想要的格式是不允许的。 XML节点必须具有标签名称和一个或多个内容。你需要一个根...

您必须使用PATH而不是AUTO。看看这个:

select top 3 name 
from sys.objects 
for xml path(''),ROOT('root'); 

select top 3 name AS [@attrib] 
from sys.objects 
for xml path('item'),ROOT('root')