2013-05-10 107 views
8
使用XML时

我目前使用XML数据类型在SQL表Where子句中SQL

我的数据表看起来像这样

Id | Name | Surname | Title | Location | Artist | 
------------------------------------------------------- 
1 | xxx | abc  | def | London | XML | 
2 | xxx | abc  | def | Oslo  | XML | 
3 | xxx | abc  | def | New York | XML | 

我的XML文件看起来像这样

<song category="gaming"> 
<title>Valentine's Day</title> 
<artist-main>Fatfinger</artist-main> 
<artist-featured>Slimthumb</artist-featured> 
<year>2013</year> 
<price>29.99</price> 
<album>Gamestain</album> 
<albumimg>http://download.gamezone.com/uploads/image/data/875338/halo-4.jpg</albumimg> 
<songurl>http://www.youtube.com/watch?v=-J0ABq9TnCw</songurl> 

现在要根据艺术家获取记录,我使用的查询是

SELECT 
Id, Name, Surname, Title 
FROM 
DATA 
WHERE 
Artist Like '%Fatfinger%' -- (this is user input) 

这是查询SQL中的XML数据的正确方法,还是SQL中有可以处理XML的任何内置函数?我是SQL新手。

+0

至极RDBM的您使用的是MS SQL服务器,Oracle等重新标记您的问题,因此它具有更好的可视性,因此得到一些关注 – Yaroslav 2013-05-10 14:39:50

+0

另外,检查你的XML sintax,第3行和第4行没有正确的结束标记。应该是'artist-main'和'artist-feature'。我猜想最后会有一个关闭''标签。 – Yaroslav 2013-05-10 14:45:08

+0

@Yaroslav我正在使用MS SQL 2012 – 2013-05-10 15:38:47

回答

11

试试这个:

declare @table table (
Id int, Name varchar(50), Surname varchar(50), 
Title varchar(50), Location varchar(50), Artist xml) 

insert into @table (Id, Name, Surname, Title, Location , Artist) 
values(1, 'xxx', 'abc', 'def', 'London', '<song category="gaming"></song> 
<title>Valentines Day</title> 
<artist-main>Fatfinger</artist-main> 
<artist-featured>Slimthumb</artist-featured> 
<year>2013</year> 
<price>29.99</price> 
<album>Gamestain</album> 
<albumimg>http://download.gamezone.com/uploads/image/data/875338/halo-4.jpg</albumimg> 
<songurl>http://www.youtube.com/watch?v=-J0ABq9TnCw</songurl>') 

SELECT Id, Name, Surname, Title 
FROM @table 
WHERE Artist.value('(/artist-main)[1]','varchar(max)') LIKE '%FatFinger%' 
+0

你要回答所有的XML问题:) – 2013-05-10 18:53:06

+1

否:)。我最近学到了一些XML,所以我只知道答案。 – 2013-05-10 18:58:07

+0

@Mike在本声明中,我可以使用“=”运算符而不是“Like”吗?还有一件事是“[1]”意味着什么?谢谢 – 2013-05-10 19:44:42

7

您需要使用.value函数。

SELECT Id, Name, Surname, Title 
FROM DATA 
WHERE Artist.value('(/song/artist-main)[1]','varchar(max)') LIKE '%FatFinger%' 
+0

在本声明中,我可以使用“=”运算符而不是“Like”吗?还有一件事是“[1]”意味着什么?谢谢 – 2013-05-10 19:43:03

+0

是的,你可以。只要删除通配符。另外,[1]表示您将返回该歌曲/艺术​​家主节点的第一个值。那就是你想要的。上面的John M Gant的链接也提到了这一点。 – 2013-05-10 19:50:15