2016-08-11 59 views
0

我在下面的格式在SQL表輸入數據:解析XML,並通過SQL查詢生成新行

ID Text 
1 <Key><Name>Adobe</Name><Display>Ado</Display></Key><Key>.....</Key> 
2 <Key><Name></Name><Display>Microsoft</Display><Version>1.1</Version></Key> 

可以有多個按鍵的每個ID.There可以在一個表幾千行以上述格式。我要生成以下格式的最終​​sql輸出

ID Name Display Version 
1 Adobe Ado  
1 xyz yz   1.2 
2   Microsoft 1.1 

我正在使用下面的查詢來解析文本列,但獲取一行中的所有數據。如何按上述方式將這些數據分成多行。

SELECT 
    CAST(CAST(Text AS XML).query('data(/Key/Name)') AS VARCHAR(MAX)) AS Name, 
    CAST(CAST(Text AS XML).query('data(/Key/Display)') as VARCHAR(MAX)) AS DisplayName, 
    CAST(CAST(Text AS XML).query('data(/Key/Version)') AS VARCHAR(MAX)) AS Version 
FROM 
    ABC where ID = 1 

目前我正在爲每個ID在一次運行此查詢。有沒有辦法一起運行所有的ID?另外,還有沒有其他有效的方法來獲得所需的輸出。

回答

0

這裏是例如:

-- Sample demonstrational schema 
declare @t table (
    Id int primary key, 
    TextData nvarchar(max) not null 
); 

insert into @t 
values 
(1, N'<Key><Name>Adobe</Name><Display>Ado</Display></Key><Key><Name>xyz</Name><Display>yz</Display><Version>1.2</Version></Key>'), 
(2, N'<Key><Name></Name><Display>Microsoft</Display><Version>1.1</Version></Key>'); 

-- The actual query 
with cte as (
    select t.Id, cast(t.TextData as xml) as [XMLData] 
    from @t t 
) 
select c.Id, 
    k.c.value('./Name[1]', 'varchar(max)') as [Name], 
    k.c.value('./Display[1]', 'varchar(max)') as [DisplayName], 
    k.c.value('./Version[1]', 'varchar(max)') as [Version] 
from cte c 
    cross apply c.XMLData.nodes('/Key') k(c); 

不同類型可以與在CTE完成就地澆鑄/轉換(或等效子查詢)進行校正。

+0

如果包含XML數據的列不是xml類型,該怎麼辦?在我的情況下,包含XML數據的列是nvarchar類型,所以我得到錯誤,因爲「XMLDT方法'節點'只能在xml類型的列」 – Anks

+0

@Anks上調用,更新了我的答案。 –