2012-01-16 95 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表中獲取所有條目。