我从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
值。
我哪里错了?
答案 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() 允许我用逗号分隔符(或者它可以是您想要的任何内容)分隔值,并从字符串中删除第一个逗号。
我认为客户更愿意看到
<块引用>苹果、橙子、梨
而不是
<块引用>苹果、橙子、梨
或更糟
<块引用>苹果橙子梨