Vous devez faire quelque chose comme ceci:
SELECT
t.ID, -- or whatever you need from the table where the XML is located
tbl.People.query('AdditionalInfoList')
FROM
dbo.YourTable t
CROSS APPLY
t.(xmlcolumn).nodes('/People') AS Tbl(People)
WHERE
tbl.People.value('(Item[@Name="Info"]/@Value)[1]', 'varchar(50)') LIKE '%Software Development%'
OR
tbl.People.value('(Item[@Name="Title"]/@Value)[1]', 'varchar(50)') LIKE '%Software Engineer%'
Cela devrait vous donner toutes les entrées qui vous intéressent
Explications:.
Le CROSS APPLY
crée une table "factices" à laquelle vous devez donner un nom - ici: Tbl(People)
. Ce nom n'a pas vraiment d'importance, et il n'est pas sensible à la casse, donc Tbl
et tbl
sont identiques.
Si vous voulez Guid et le type de valeurs distinctes de la <AdditionalInfoList>
, vous devez utiliser cette requête ici:
SELECT
t.ID,
--tbl.People.value('(Item[@Name="Info"]/@Value)[1]', 'varchar(50)') AS 'Info',
--tbl.People.value('(Item[@Name="Title"]/@Value)[1]', 'varchar(50)') AS 'Title'
Adtl.Info.value('(@Guid)[1]', 'varchar(50)') AS 'GUID',
Adtl.Info.value('(@type)[1]', 'varchar(50)') AS 'Type'
FROM
@table t
CROSS APPLY
t.xmlcolumn.nodes('/People') AS Tbl(People)
CROSS APPLY
Tbl.People.nodes('AdditionalInfoList/AdditionalInfoListItem') AS Adtl(Info)
WHERE
Tbl.People.value('(Item[@Name="Info"]/@Value)[1]', 'varchar(50)') LIKE '%Software Development%'
OR
Tbl.People.value('(Item[@Name="Title"]/@Value)[1]', 'varchar(50)') LIKE '%Software Engineer%'
Vous avez essentiellement à faire une deuxième CROSS APPLY (qui blessera votre performance !) pour obtenir la liste des "informations supplémentaires" pour chacune des entrées de Tbl.Person
et extraire le Guid et la valeur du type à partir de cela.
Découvrez l'introduction SQL Server 2005 XQuery and XML DML - à peu près au milieu de l'article, il y a une section sur la façon d'utiliser la fonction .nodes()
. Très utile!
Ma solution actuelle consiste à lire tout le code XML dans une chaîne XML, puis à analyser la chaîne XML, ce qui, à mon avis, est moins efficace. Je veux trouver une solution plus efficace. – George2