2012-03-26 59 views
10

Tôi có một bảng RDCAlerts với các dữ liệu sau đây trong một cột kiểu XML gọi AliasesValue:Trở nhiều hàng từ truy vấn cột XML trong SQL Server 2008

<aliases> 
    <alias> 
    <aliasType>AKA</aliasType> 
    <aliasName>Pramod Singh</aliasName> 
    </alias> 
    <alias> 
    <aliasType>AKA</aliasType> 
    <aliasName>Bijoy Bora</aliasName> 
    </alias> 
</aliases> 

Tôi muốn tạo ra một truy vấn mà trả về hai hàng - một cho mỗi bí danh và tôi đã thử các truy vấn sau đây:

SELECT 
    AliasesValue.query('data(/aliases/alias/aliasType)'), 
    AliasesValue.query('data(/aliases/alias/aliasName)'), 
FROM [RdcAlerts] 

nhưng nó sẽ trả về chỉ một dòng như thế này:

phương pháp

Trả lời

15

Nhìn vào .nodes() trong Sách Online:

DECLARE @r TABLE (AliasesValue XML) 
INSERT INTO @r 
SELECT '<aliases> <alias>  <aliasType>AKA</aliasType>  <aliasName>Pramod Singh</aliasName> </alias> <alias>  <aliasType>AKA</aliasType>  <aliasName>Bijoy Bora</aliasName> </alias> </aliases> ' 


SELECT c.query('data(aliasType)'), c.query('data(aliasName)') 
FROM @r r CROSS APPLY AliasesValue.nodes('aliases/alias') x(c) 
+0

Làm đẹp! Cảm ơn rất nhiều, nhiều đánh giá cao =) –

+0

Đó là 5 năm sau khi bạn viết câu trả lời của bạn ... và nó chỉ giúp tôi giải quyết một vấn đề tôi đang gặp phải. Cảm ơn! – PKD

+0

bạn được chào đón :) –

12

Bạn cần phải sử dụng câu lệnh CROSS APPLY cùng với .nodes() chức năng để có được nhiều hàng trả lại.

select 
    a.alias.value('(aliasType/text())[1]', 'varchar(20)') as 'aliasType', 
    a.alias.value('(aliasName/text())[1]', 'varchar(20)') as 'aliasName' 
from 
    RDCAlerts r 
    cross apply r.AliasesValue.nodes('/aliases/alias') a(alias) 
+0

Chúc mừng, đánh giá cao ;-) –

Các vấn đề liên quan