2016-06-15 150 views
2

我从一个SQL字符串中获取数据,使XML文件,这里是我的SQL删除XML标记

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

这里是我的XML返回

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

问题我已经是我想要的标签DataLocation但不是标签data,我只想显示String值。

我哪里错了?

+0

如果有多个匹配行,你想要什么? – AakashM

+0

@AakashM我不需要标记我只需要值“字符串”我只想要的是标记 – Nonagon

回答

1

列的名称用作xml标签。幸运的是,如果你有一个不明确的或空的(据我记忆)列名称,将不会有XML标签。

所以这应该工作:

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

如果没有,试试这个:

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

这不起作用,但它给了我一个很好的逻辑来寻找和更好的理解。谢谢编辑:heres错误 - 列名''包含FOR XML所要求的无效XML标识符; – Nonagon

1

从你的评论,你真正想要的是一个DataLocation标签内的单个字符串值。因此,所有你需要的是

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

需要注意的是,如果你的表中有多个匹配行,你会得到多个DataLocation标签输出;您可以使用额外的, ROOT('whatever')以根元素包围这些标记。

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> 
3

有几种方法导致同样的结果。所有的人都存在微小的商品和劣品:

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

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