2012-01-16 99 views
4

值我有一个XML列的表像这样保存XML它:如何使用SQL函数计算列来检索XML

<Employees> 
    <Person> 
     <ID>1000</ID> 
     <Name>Nima</Name> 
     <LName>Agha</LName> 
    </Person> 
</Employees> 

我想有一列的另一个表在这我用一个函数来从每一个检索Name元素的值row.such这样的:

Id   Name 
    ----------------- 
    1   Nima 
    2   Agha 
    ...   ... 

我怎么能做到这一点?

感谢

+0

抱歉不明白这个问题。请说明你的问题。 – 2012-01-16 08:11:58

+0

您是否需要从Name和LName节点获取值?下一个Person节点应该是什么ID? – Dalex 2012-01-16 08:17:04

+0

我想将我的XML数据转换为关系数据和列数据。首先,我想通过视图来实现这一点,然后我想在我的视图上创建索引,但它没有此功能。现在我想将我的xml数据列,我可以使用列索引 – Arian 2012-01-16 08:17:28

回答

4

使用这样的:

CREATE FUNCTION dbo.GetName(@xml XML) 
RETURNS NVARCHAR(MAX) 
WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
    RETURN @xml.value('/Employees[1]/Person[1]/Name[1]', 'nvarchar(max)') 
END 
GO 
SELECT dbo.GetName(CAST(N' 
<Employees> 
    <Person> 
     <ID>1000</ID> 
     <Name>Nima</Name> 
     <LName>Agha</LName> 
    </Person> 
</Employees>' AS XML)) 

你必须提供你的Id场之间从第二表到XML字段从第一

+0

好的,谢谢,但我怎么能用这个列的默认值?请再次阅读我的问题。我可以查询XML列... – Arian 2012-01-16 08:21:40

+1

'CREATE TABLE blabla(xmlcolumn xml,name nvarchar(max)default dbo.GetName(xmlcolumn))' – 2012-01-16 08:22:52

+0

谢谢,1步前进,但我想要使用此值在另一个表 – Arian 2012-01-16 08:26:19

3

连接尝试使用表值函数。

CREATE FUNCTION dbo.GetTableFromXML(@xml XML) 
RETURNS @retXMLTable TABLE 
(
    -- Columns returned by the function 
    ID int PRIMARY KEY NOT NULL, 
    Name nvarchar(max) NULL, 
    LName nvarchar(max) NULL, 
)AS 
BEGIN 
INSERT @retXMLTable (ID,FirstName,LName) 
select @xml.value('/Employees[1]/Person[1]/ID[1]', 'nvarchar(max)'), 
     @xml.value('/Employees[1]/Person[1]/Name[1]', 'nvarchar(max)') 
     @xml.value('/Employees[1]/Person[1]/LName [1]', 'nvarchar(max)') 
RETURN; 
END; 

与Oleg的答案大体相同,但是您已将结果作为表进行操作。如果重新创建样本,您可以立即从xml表中获取所有条目。