从FOR XML PATH中删除XML标记

5

我正在从一个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的值。
我错在哪里了?

如果有多行匹配,您想要什么? - AakashM
@AakashM 我不需要<data>标签,我只需要值“String”。我想要的只是<DataLocation>标签。 - Nonagon
6个回答

7

有几种方法可以达到相同的结果。它们都有优缺点:

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('') 

背景简介:如果有列名,将会使用该列名。因此,你需要找到一种方法来消除这个列名,或者用你想要的列名替换它。


2

结果将被包装在一个xml元素中,该元素的名称为列名,并且该元素又将被包装在XML PATH的值中。

这应该可以正常工作:

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

这个不起作用,但它给了我一个好的逻辑去寻找和更好的理解。谢谢。编辑:这里是错误--列名''包含一个无效的XML标识符,如FOR XML所需。 - Nonagon
1
这实际上将选择的数据包装在另一个标记中。 - Jeremy

1

从您的评论中,实际上您想要的是在 DataLocation 标签内的单个字符串值。所以您需要的只是:

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

请注意,如果您的表格有多个匹配行,则会输出多个 DataLocation 标签;您可以使用额外的 , ROOT('whatever') 将这些标签包围在根元素中。

1
也许您在找这个?
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>

1
这个帖子帮助我解决了类似的问题;也许其他人也有同样的问题:
如果列"data"本身是XML数据类型,你可能会发现多了一个不想要的XML标签:
SELECT [data] AS data
FROM MyTable
WHERE Status = '1'
FOR XML PATH('DataLocation')

假设“data”包含“bar”。那么上述查询将返回:
<DataLocation><data><foo>bar</foo></data></DataLocation>

如果您只想返回以下内容:
<foo>bar</foo>

然后将查询更改为:

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

0

我不得不回到SO再次寻找这个问题,因为多年来我一直没有使用FOR XML,但很多客户都希望在数据方面获得良好的用户体验。为此,我开发了这个小版本的代码,增加了逗号分隔值的功能。

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

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

然而,使用STUFF()允许我用逗号分隔符(或任何你想要的字符)分离值,并从字符串中删除第一个逗号。

我认为客户更愿意看到

苹果,橙子,梨

而不是

苹果,橙子,梨

或者更糟糕的是

苹果橙子梨


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接