对带有标记属性的XML的SQL查询
有一张桌子:对带有标记属性的XML的SQL查询,sql,sql-server,xml,Sql,Sql Server,Xml,有一张桌子: CREATE TABLE temp (ID int, name varchar(50)); INSERT INTO temp ([ID], [name]) VALUES (1, 'Value 1'), (2, 'Value 2'); 需要SQL查询返回以下结果: <root> <row> <param name="first">1</param> <param name="secon
CREATE TABLE temp
(ID int, name varchar(50));
INSERT INTO temp
([ID], [name])
VALUES
(1, 'Value 1'),
(2, 'Value 2');
需要SQL查询返回以下结果:
<root>
<row>
<param name="first">1</param>
<param name="second">Value 1</param>
</row>
<row>
<param name="first">2</param>
<param name="second">Value 2</param>
</row>
</root>
请更正查询以使其正常工作。您可以通过子查询实现这一点:
SELECT 'first' as [param/@name],
ID as [param],
(SELECT 'second' as [param/@name],
name as [param]
FROM temp t1 WHERE t1.ID = t.ID
FOR XML PATH(''), TYPE )
FROM temp t
FOR XML PATH('row'), root('root')
输出:
<root>
<row>
<param name="first">1</param>
<param name="second">Value 1</param>
</row>
<row>
<param name="first">2</param>
<param name="second">Value 2</param>
</row>
</root>
您可以通过子查询实现这一点:
SELECT 'first' as [param/@name],
ID as [param],
(SELECT 'second' as [param/@name],
name as [param]
FROM temp t1 WHERE t1.ID = t.ID
FOR XML PATH(''), TYPE )
FROM temp t
FOR XML PATH('row'), root('root')
输出:
<root>
<row>
<param name="first">1</param>
<param name="second">Value 1</param>
</row>
<row>
<param name="first">2</param>
<param name="second">Value 2</param>
</row>
</root>
最简单的方法可能是:
SELECT 'first' as [param/@name]
,ID as [param]
,''
,'second' as [param/@name]
,[name] as [param]
FROM temp t
FOR XML PATH('row'), root('root');
简而言之:
引擎沿列向下运行并找到
我们必须开一家银行
我们必须为每一行打开一个窗口
好的,第一列是新元素,我们必须打开它。
现在,首先必须将该值写入属性@name。
下一个值ID也存在于中,它仍处于打开状态。将其添加为文本节点。
那么下一列是-嗯-空的???然而首先我们必须关闭开放的。。。
好的,下一个专栏看起来更好。有一个元素。。。好的,最后一个已经关闭了,我们必须打开一个新的
等等
这也适用于路径片段:
SELECT 'first' as [param/onemore/@name]
,ID as [param/onemore]
,'' AS [param]
,'second' as [param/onemore/@name]
,[name] as [param/onemore]
FROM temp t
FOR XML PATH('row'), root('root');
结果
<root>
<row>
<param>
<onemore name="first">1</onemore>
<onemore name="second">Value 1</onemore>
</param>
</row>
<row>
<param>
<onemore name="first">2</onemore>
<onemore name="second">Value 2</onemore>
</param>
</row>
</root>
在这种情况下,我们是开放的,但我们保持开放。最简单的方法可能是:
SELECT 'first' as [param/@name]
,ID as [param]
,''
,'second' as [param/@name]
,[name] as [param]
FROM temp t
FOR XML PATH('row'), root('root');
简而言之:
引擎沿列向下运行并找到
我们必须开一家银行
我们必须为每一行打开一个窗口
好的,第一列是新元素,我们必须打开它。
现在,首先必须将该值写入属性@name。
下一个值ID也存在于中,它仍处于打开状态。将其添加为文本节点。
那么下一列是-嗯-空的???然而首先我们必须关闭开放的。。。
好的,下一个专栏看起来更好。有一个元素。。。好的,最后一个已经关闭了,我们必须打开一个新的
等等
这也适用于路径片段:
SELECT 'first' as [param/onemore/@name]
,ID as [param/onemore]
,'' AS [param]
,'second' as [param/onemore/@name]
,[name] as [param/onemore]
FROM temp t
FOR XML PATH('row'), root('root');
结果
<root>
<row>
<param>
<onemore name="first">1</onemore>
<onemore name="second">Value 1</onemore>
</param>
</row>
<row>
<param>
<onemore name="first">2</onemore>
<onemore name="second">Value 2</onemore>
</param>
</row>
</root>
在本例中,我们重新打开了,但我们仍保持在打开状态。第二个片段与第一个片段完全不同。你确定吗?@YitzhakKhabinsky谢谢!更正如果建议的解决方案对您有效,请将其标记为正确的绿色检查图像。第二个片段与第一个片段完全不同。你确定吗?@YitzhakKhabinsky谢谢!正确如果建议的解决方案适合您,请将其标记为正确的绿色复选框图像。这正是所需的!谢谢!伊扎克,我想,这可以说得更简单。。。我只是自己写了一个答案…正是我所需要的!谢谢!伊扎克,我想,这可以说得更简单。。。我刚刚给了自己一个答案…好答案,+1来自我这边!有第二个解决方案总是很好的。这可以做得更简单,我只是放了一个答案,可能对你来说很有趣…很好的答案,+1来自我这边!有第二个解决方案总是很好的。这可以做得更简单,我只是放置了一个答案,可能对你们来说很有趣…奇怪,我从你们的答案开始尝试了相同的查询,但它不起作用。。。所以我提出了一个w/子查询:回答得很好,+1来自我这边!谢谢你的详细解释。奇怪的是,我从你回答的开始就尝试了同样的问题,但没有成功。。。所以我提出了一个w/子查询:回答得很好,+1来自我这边!谢谢你的详细解释。