从FOR XML PATH中删除XML标记

时间:2016-06-15 10:26:35

标签: sql-server xml tsql

我从sql字符串中获取数据以生成XML文件,这是我的SQL

SELECT [data] AS data
FROM MyTable 
WHERE [Status] = '1' 
FOR XML PATH('DataLocation')

这是我的XML返回

<DataLocation>
  <data>String</data>
</DataLocation>

我遇到的问题是我想要标记DataLocation而不是标记data,我只想显示String值。

我哪里错了?

6 个答案:

答案 0 :(得分:4)

有几种方法可以产生相同的结果。所有人都有小商品和坏商品:

DECLARE @tbl TABLE(Data NVARCHAR(100), [Status] INT)
INSERT INTO @tbl(Data, [Status]) VALUES 
 ('test 1 with 1', 1)
,('test 1 with 2', 2)
,('test 2 with 1', 1);

SELECT [data] AS [*]
FROM @tbl
WHERE [Status] = 1
FOR XML PATH('DataLocation');

SELECT [data] AS [node()]
FROM @tbl
WHERE [Status] = 1
FOR XML PATH('DataLocation');

SELECT '' + [data] --Any kind of computation results in "no caption name"
FROM @tbl
WHERE [Status] = 1
FOR XML PATH('DataLocation') 

SELECT [data] AS DataLocation
FROM @tbl
WHERE [Status] = 1
FOR XML PATH('') 

背景较小:如果有列名,则会使用它。所以你必须找到一种方法来摆脱这个列名,或者用你想要的那个替换它。

答案 1 :(得分:2)

结果将包含在一个带有列名的xml元素中,而该列的名称将包含在XML PATH的值中。

这应该有效:

SELECT [data] as 'DataLocation'
FROM MyTable
WHERE [Status] = '1' 
FOR XML PATH('')

答案 2 :(得分:1)

根据您的评论,您真正想要的是DataLocation标记内的单个字符串值。所以你需要的只是

SELECT data AS DataLocation
FROM MyTable
WHERE Status = '1'
FOR XML PATH ('')

请注意,如果您的表有多个匹配的行,您将获得多个DataLocation标记输出;您可以使用额外的, ROOT('whatever')将这些标记与根元素包围起来。

答案 3 :(得分:1)

该线程帮助我解决了类似的问题;也许其他人也有同样的问题:

在“数据”列本身就是XML数据类型的情况下,您可能会发现自己不想要其他XML标记:

SELECT [data] AS data
FROM MyTable
WHERE Status = '1'
FOR XML PATH('DataLocation')

说“数据”包含“条”。然后上面的查询将返回:

<DataLocation><data><foo>bar</foo></data></DataLocation>

如果只希望返回以下内容:

<foo>bar</foo>

然后将查询更改为此:

SELECT CAST([data] AS XML)
FROM MyTable
WHERE Status = '1'
FOR XML PATH('')

答案 4 :(得分:0)

也许你在找这个?

DECLARE @MyTable TABLE(Data NVARCHAR(256), [Status] NVARCHAR(10))
INSERT INTO @MyTable(Data, [Status])
VALUES ('String', '1'), ('String1', '1'), ('String2', '1'), ('String3', '1'), ('String4', '2') 

SELECT STUFF((SELECT ' ' + Data FROM @MyTable WHERE [Status] = '1' FOR XML PATH('')), 1, 1, '') AS DataLocation FOR XML PATH('')

结果

<DataLocation>String String1 String2 String3</DataLocation>

答案 5 :(得分:0)

我不得不回到 SO 再次寻找这个问题,因为我不得不使用 FOR XML 已经好几年了,但是很多客户想要的一件事是良好的用户体验,以及数据。为此,我开发了这个小版本的代码,添加了逗号分隔值的功能。

SELECT STUFF(
        (SELECT ', ' + [data] AS data 
         FROM MyTable 
         WHERE Status = '1' 
         FOR XML PATH('')),1,2,'')

显然是正确的答案,上面已经回答了 - PATH('')

但是,使用 STUFF() 允许我用逗号分隔符(或者它可以是您想要的任何内容)分隔值,并从字符串中删除第一个逗号。

我认为客户更愿意看到

<块引用>

苹果、橙子、梨

而不是

<块引用>

苹果、橙子、梨

或更糟

<块引用>

苹果橙子梨