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

Ari*_*ian 4 xml sql sql-server sql-server-2008

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

<Employees>
    <Person>
        <ID>1000</ID>
        <Name>Nima</Name>
        <LName>Agha</LName>
    </Person>   
</Employees>
Run Code Online (Sandbox Code Playgroud)

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

  Id           Name
  -----------------
  1            Nima
  2            Agha
  ...          ...
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

谢谢

Ole*_*Dok 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))
Run Code Online (Sandbox Code Playgroud)

你必须提供Id从第二个表到第一个表的xml字段之间的连接


小智 5

尝试使用表值函数。

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;
Run Code Online (Sandbox Code Playgroud)

一般来说与奥列格的答案相同,但您可以将结果作为表格使用。如果重新创建示例,您将立即从 xml 表中获取所有条目。