【问题标题】:Convert rows into XML nodes in SQL在 SQL 中将行转换为 XML 节点
【发布时间】:2016-07-25 10:05:57
【问题描述】:

我必须像下面的格式一样从两列表中返回 XML

表格

month       count
-----       ----
January     578
February    300
March       147
April       45
May         8

XML

<January>578</January>
<February>300</February>
<March>147</March>
<April>45</April>
<May>8</May>

我试过下面的SQL语句,

SELECT * FROM #temp;

SELECT (
   SELECT monthId AS 'month/@atr', count AS month
   FROM #temp
   FOR XML PATH(''), TYPE
) 
FOR XML PATH('')

而且我知道上面的脚本是为了获取第一列的值作为属性。 在我的例子中,我需要第一列值作为节点,第二列作为它的值。

感谢您的帮助。

【问题讨论】:

  • 是否可以通过 SQL 查询本身实现?

标签: sql sql-server xml tsql


【解决方案1】:
DECLARE @t TABLE ([month] VARCHAR(50) PRIMARY KEY, [count] INT)

INSERT INTO @t
VALUES
    ('January', 578), ('February', 300),
    ('March', 147), ('April', 45), ('May', 8)

SELECT *
FROM @t
PIVOT (
    SUM(count)
    FOR month IN ([January], [February], [March], [April], [May], [June], [Jule]) 
) p
FOR XML PATH('')

【讨论】:

  • 由于月份的名称是一个封闭的集合,PIVOT 是一个很好的方法......我这边 +1。
【解决方案2】:

它很奇怪,但服务于目的,

DECLARE @MyTable TABLE ( Month VARCHAR(20), Count INT)

INSERT INTO @MyTable (Month, Count) 
VALUES 
     ('January' , 578)
    ,('February', 300)
    ,('March'   , 147)
    ,('April'   , 45 )
    ,('May'     , 8  )

SELECT 
  CAST('<' + Month + '>' + CAST(Count AS VARCHAR(20)) + '</' + Month + '>' AS XML) 
FROM @MyTable
FOR XML PATH('')

---- 输出----

<January>578</January>
<February>300</February>
<March>147</March>
<April>45</April>
<May>8</May>

【讨论】:

  • 我(几乎)从不建议使用字符串方法构建 XML,但在这种情况下,这是一种非常有创意的方法,对我来说 +1!
【解决方案3】:

您可以(也许)直接使用 pivot 或使用动态 SQL:

DECLARE @tbl TABLE([month] VARCHAR(100),[count] INT);
INSERT INTO @tbl VALUES
 ('January',578)
,('February',300)
,('March',147)
,('April',45)
,('May',8);

DECLARE @cmd VARCHAR(MAX)=
'SELECT ' +
(
    STUFF(
    (
        SELECT ',' + CAST(tbl.[count] AS VARCHAR(100)) + ' AS [' + tbl.[month] + ']'
        FROM @tbl AS tbl
        FOR XML PATH('')
    ),1,1,''
    ) 
)
+
' FOR XML PATH('''');';

EXEC(@cmd);

结果

<January>578</January>
<February>300</February>
<March>147</March>
<April>45</April>
<May>8</May>

但我不会这样做...

创建这样的结构要好得多(更容易查询!):

SELECT tbl.[month] AS [@name]
      ,tbl.[count] AS [*]
FROM @tbl AS tbl
FOR XML PATH('month');

结果

<month name="January">578</month>
<month name="February">300</month>
<month name="March">147</month>
<month name="April">45</month>
<month name="May">8</month>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多