如何使用sql函数为计算列从XML中检索值

时间:2012-01-16 08:01:35

标签: sql sql-server xml sql-server-2008

我有一个带有XML列的表,并将这样的XML保存到它:

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

我想要另一个包含列的表,其中我使用函数从每行检索Name元素的值。这样:

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

我怎么能这样做?

感谢

2 个答案:

答案 0 :(得分:5)

像这样使用:

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字段之间的连接

答案 1 :(得分:4)

尝试使用表值函数。

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表中获取所有条目。