2013-05-10 15 views
8

Obecnie używam typ danych XML w tabeli SQLWhere przy użyciu języka XML w SQL

Moje DataTable wygląda następująco

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 | 

mój plik XML wygląda to

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

Teraz, aby uzyskać rekord w zależności od wykonawcy, używam zapytania o nazwie

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

Czy to jest właściwe podejście w kwerendach danych XML w SQL lub czy są jakieś wbudowane funkcje w SQL, które mogą obsługiwać XML. Jestem nowy w SQL.

+0

Wich RDBM na używasz, MS SQL Server, Oracle, itp zmieniać tagów Twoje pytanie tak ma lepszą widoczność, a więc trochę uwagi – Yaroslav

+0

także sprawdzić swoją XML sintax, linia 3 i 4 nie mają poprawnego tagu zamykającego. Powinien być 'artist-main' i' artist-feature'. I domyślam się, że na końcu znajduje się zamykający tag ''. – Yaroslav

+0

@Yaroslav Używam MS SQL 2012 –

Odpowiedz

11

Spróbuj tego:

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

Czy odpowiadasz na wszystkie pytania xml sql :) –

+1

Nie :). Niedawno nauczyłem się xml, więc po prostu znałem odpowiedź. –

+0

@Mike Czy mogę użyć operatora "=" zamiast "Lubię to" w tym zestawieniu? I jeszcze jedno co oznacza "[1]"? Dzięki –

7

Musisz użyć funkcji .value.

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

Czy mogę użyć operatora "=" zamiast "Lubię to" w tym zestawieniu? I jeszcze jedno co oznacza "[1]"? Dzięki –

+0

Tak, możesz. Po prostu usuń znaki wieloznaczne. Ponadto [1] oznacza, że ​​zwrócisz pierwszą wartość w tym węźle głównego wykonawcy/wykonawcy. To jest to czego chcesz. Powyższe powiązanie Johna M Ganta również to wspomina. –

Powiązane problemy