2008-11-05 9 views
2

J'ai une table "Blah" avec une colonne PK BlahID et une BlahItems de colonne XML dans une base de données sur SQL Server 2005.Comment puis-je relier une colonne XML à l'enregistrement dont elle provient?

Ce tableau a des dossiers comme suit ...

 
BlahID BlahItems 
------ ------------------------------------------------------ 
1  <root><item name="Fred" /><item name="Wilma" /></root> 
2  <root><item name="Lisa" /><item name="Bart" /></root> 

Comment puis-je interroger cette table pour produire ce qui suit ....

 
BlahID BlahItem 
------ -------- 
1  Fred 
1  Wilma 
2  Lisa 
2  Bart 

le plus proche que j'ai réussi à obtenir est un enregistrement par fonction qui fait quelque chose le long des lignes de ce qui suit ...

CREATE FUNCTION dbo.Blahs(@id int) 
RETURNS @list TABLE (BlahID int, BlahItem nvarchar(max)) 
BEGIN 
    DECLARE @xml AS xml 
    SELECT @xml = BlahItems FROM dbo.Blah AS b WHERE b.BlahID = @id 

    INSERT INTO @list 
    SELECT @id, tbl.col.value('@name','nvarchar(max)') 
    FROM @xml.nodes('/root/item') tbl(col) 
    RETURN 
END 

SELECT * FROM dbo.Blahs(1) 
 
BlahID BlahItem 
------ -------- 
1  Fred 
1  Wilma 

Mon but ultime est de créer une vue des données « étendues », puis la requête sur la vue.

Répondre

5

Vous pouvez essayer cette requête:

SELECT BlahID, XmlItems.BlahItem.value('@name', 'nvarchar(100)') AS BlahItem 
FROM Blah CROSS APPLY BlahItems.nodes('/root/item') AS XmlItems(BlahItem) 

Pour plus d'informations vérifier this three-part article par Alex Homer.

+0

Génial merci. Il fonctionne comme un charme. – BlackMael

Questions connexes