从SQL表创建XML-如何从XML结构中删除不需要的标记?
我有一个表从SQL表创建XML-如何从XML结构中删除不需要的标记?,sql,sql-server,sql-server-2012,sql-server-2008-r2,Sql,Sql Server,Sql Server 2012,Sql Server 2008 R2,我有一个表tmpZstock,有两列:ZART\u Article code(itemcode)和GERNR\u SerialNO(serialnumber): 我需要像这样创建xml: 但是当我写这个查询时: Select [ZART_Article Code] as ITEMCODE , ( Select SERIALS.[GERNR_SerialNO] as SERIALNO From tmpZstock SERIALS where SERIALS.[ZART_Article C
tmpZstock
,有两列:ZART\u Article code
(itemcode)和GERNR\u SerialNO
(serialnumber):
我需要像这样创建xml:
但是当我写这个查询时:
Select [ZART_Article Code] as ITEMCODE ,
(
Select SERIALS.[GERNR_SerialNO] as SERIALNO From tmpZstock SERIALS
where SERIALS.[ZART_Article Code]=T1.[ZART_Article Code] FOR XML rAW ('SERIALS'), TYPE )
From (select [ZART_Article Code] from tmpZstock group by [ZART_Article Code]) t1 FOR XML PATH('SERIALNUMBERDETAILS'), TYPE
,Root ('SUMMARY')
结果是:
我不需要
标记-如何从结果中删除此标记?您可以将其用于xml路径。像这样的东西应该可以
select T1.[ZART_Article Code] as ITEMCODE,
(
select T2.GERNR_SerialNO as SERIALNO
from tmpZstock as T2
where T1.[ZART_Article Code] = T2.[ZART_Article Code]
for xml path(''), type
)
from tmpZstock as T1
group by T1.[ZART_Article Code]
for xml path('SERIALNUMBERDETAILS'), root('SUMMARY')
带有表变量的工作示例
declare @T table
(
[ZART_Article Code] int,
GERNR_SerialNO int
);
insert into @T values
(200078, 126),
(200078, 127),
(200078, 128),
(200078, 129),
(200078, 130),
(200079, 131),
(200079, 132),
(200079, 133),
(200079, 134),
(200079, 135),
(200079, 136),
(200079, 137),
(200079, 138),
(200079, 139),
(200079, 140),
(200079, 141),
(200080, 142),
(200080, 143),
(200080, 144),
(200080, 145);
select T1.[ZART_Article Code] as ITEMCODE,
(
select T2.GERNR_SerialNO as SERIALNO
from @T as T2
where T1.[ZART_Article Code] = T2.[ZART_Article Code]
for xml path(''), type
)
from @T as T1
group by T1.[ZART_Article Code]
for xml path('SERIALNUMBERDETAILS'), root('SUMMARY')
结果:
<SUMMARY>
<SERIALNUMBERDETAILS>
<ITEMCODE>200078</ITEMCODE>
<SERIALNO>126</SERIALNO>
<SERIALNO>127</SERIALNO>
<SERIALNO>128</SERIALNO>
<SERIALNO>129</SERIALNO>
<SERIALNO>130</SERIALNO>
</SERIALNUMBERDETAILS>
<SERIALNUMBERDETAILS>
<ITEMCODE>200079</ITEMCODE>
<SERIALNO>131</SERIALNO>
<SERIALNO>132</SERIALNO>
<SERIALNO>133</SERIALNO>
<SERIALNO>134</SERIALNO>
<SERIALNO>135</SERIALNO>
<SERIALNO>136</SERIALNO>
<SERIALNO>137</SERIALNO>
<SERIALNO>138</SERIALNO>
<SERIALNO>139</SERIALNO>
<SERIALNO>140</SERIALNO>
<SERIALNO>141</SERIALNO>
</SERIALNUMBERDETAILS>
<SERIALNUMBERDETAILS>
<ITEMCODE>200080</ITEMCODE>
<SERIALNO>142</SERIALNO>
<SERIALNO>143</SERIALNO>
<SERIALNO>144</SERIALNO>
<SERIALNO>145</SERIALNO>
</SERIALNUMBERDETAILS>
</SUMMARY>
200078
126
127
128
129
130
200079
131
132
133
134
135
136
137
138
139
140
141
200080
142
143
144
145
能否以文本形式提供源数据?如果我们可以复制/粘贴,那么编写查询就更容易了。或者更好的是,将源数据提供为temp table/table var或sqlfiddle。这就给了我们一些东西来编写查询。Upvoted,只需要用前导零填充值,就可以精确地得到OP要求的输出。@3N1GM4对此不确定,因为OP的查询中没有任何内容可以处理这个问题,结果仍然是填充的。是的,很公平,数据的屏幕截图和失败解决方案的输出之间存在一些冲突,因此不清楚数据库中的值实际上是INT
还是一些VARCHAR
类型,前导零已经加在前面-没什么大不了的。@3N1GM4以防需要。太棒了,谢谢你的解释!如果可以,我会投两次票
<SUMMARY>
<SERIALNUMBERDETAILS>
<ITEMCODE>200078</ITEMCODE>
<SERIALNO>126</SERIALNO>
<SERIALNO>127</SERIALNO>
<SERIALNO>128</SERIALNO>
<SERIALNO>129</SERIALNO>
<SERIALNO>130</SERIALNO>
</SERIALNUMBERDETAILS>
<SERIALNUMBERDETAILS>
<ITEMCODE>200079</ITEMCODE>
<SERIALNO>131</SERIALNO>
<SERIALNO>132</SERIALNO>
<SERIALNO>133</SERIALNO>
<SERIALNO>134</SERIALNO>
<SERIALNO>135</SERIALNO>
<SERIALNO>136</SERIALNO>
<SERIALNO>137</SERIALNO>
<SERIALNO>138</SERIALNO>
<SERIALNO>139</SERIALNO>
<SERIALNO>140</SERIALNO>
<SERIALNO>141</SERIALNO>
</SERIALNUMBERDETAILS>
<SERIALNUMBERDETAILS>
<ITEMCODE>200080</ITEMCODE>
<SERIALNO>142</SERIALNO>
<SERIALNO>143</SERIALNO>
<SERIALNO>144</SERIALNO>
<SERIALNO>145</SERIALNO>
</SERIALNUMBERDETAILS>
</SUMMARY>