我需要用父标记包装xml数据的结果集

时间:2014-01-05 07:03:46

标签: sql sql-server xml tsql

我有一个包含xml类型列的表。我想将结果集包装在父标记中。

例如:

这是表结果集:

SELECT *
FROM MyColorTable

结果:

<Color>Red</Color>
<Color>Orange</Color>
<Color>Yellow</Color>
<Color>Green</Color>
<Color>Blue</Color>
<Color>Indigo</Color>
<Color>Violet</Color>

我想要一个将@MyXml设置如下的查询:

DECLARE @MyXml xml
SELECT @MyXml

期望的输出:

<Colors>
        <Color>Red</Color>
        <Color>Orange</Color>
        <Color>Yellow</Color>
        <Color>Green</Color>
        <Color>Blue</Color>
        <Color>Indigo</Color>
        <Color>Violet</Color>
</Colors>

由于

3 个答案:

答案 0 :(得分:3)

1)更新解决方案:

DECLARE @MyTable TABLE (Col1 XML);
INSERT @MyTable VALUES (N'<Color>Red</Color>');
INSERT @MyTable VALUES (N'<Color>Orange</Color>');
INSERT @MyTable VALUES (N'<Color>Yellow</Color>');
INSERT @MyTable VALUES (N'<Color>Blue</Color>');
INSERT @MyTable VALUES (N'<Color>Green</Color>');
INSERT @MyTable VALUES (N'<Color>Indigo</Color>');
INSERT @MyTable VALUES (N'<Color>Violet</Color>');

SELECT  t.Col1 AS '*'
FROM    @MyTable t
FOR XML PATH(''), ROOT('Colors');

输出:

<Colors>
  <Color>Red</Color>
  <Color>Orange</Color>
  <Color>Yellow</Color>
  <Color>Blue</Color>
  <Color>Green</Color>
  <Color>Indigo</Color>
  <Color>Violet</Color>
</Colors>

2)如果您只想更改@MyXML变量的内容,那么一个解决方案就是使用query method

DECLARE @MyXml XML;

SET @MyXML = N'
<Color>Red</Color>
<Color>Orange</Color>
<Color>Yellow</Color>
<Color>Blue</Color>
<Color>Green</Color>
<Color>Indigo</Color>
<Color>Violet</Color>';

SELECT @MyXml.query('<Colors>{.}</Colors>');

答案 1 :(得分:1)

SQL Server具有良好的内置支持,可以使用XML。您无需在列中存储XML tag

您应该删除不必要的<Color>标记,以便优化XML工作并减少列存储 - 在需要时很容易生成它:

SELECT [color]
FROM DataSource FOR XML PATH('Color'), ROOT('Colors')

在您不允许这样做的情况下,您可以使用SQL删除标记,如下所示:

CREATE TABLE DataSource
(
  [color] VARCHAR(32) 
)

INSERT INTO DataSource ([color])
VALUES ('<Color>Red</Color>')
      ,('<Color>Orange</Color>')
      ,('<Color>Yellow</Color>')
      ,('<Color>Blue</Color>')
      ,('<Color>Green</Color>')
      ,('<Color>Indigo</Color>')
      ,('<Color>Violet</Color>')

SELECT REPLACE(REPLACE([color],'<Color>',''),'</Color>','')
FROM DataSource FOR XML PATH('Color'), ROOT('Colors')

但上面对我来说似乎非常错误,我建议你改变你在表格中存储值的方式。

答案 2 :(得分:0)

请尝试一下,我希望它会起作用

select color from MyColorTable for xml path('Colors')

select columnname as 'color' from MyColorTable for xml path('Colors')