2013-09-03 46 views
5

Đây là XML mẫu của tôi:Kết nối giá trị xml khi lựa chọn bởi XQuery trong T-SQL

<root> 
    <element> 
     <subelement> 
      <value code="code1">value1</value> 
      <value code="code2">value2</value> 
     </subelement> 
    </element> 
</root> 

Và đây là truy vấn thử nghiệm của tôi:

DECLARE @tempTable TABLE (
    ValueCode nvarchar(MAX), 
    Value nvarchar(MAX) 
) 

DECLARE @xml XML 
select @xml = cast(c1 as xml) from OPENROWSET (BULK 'C:\test.xml', SINGLE_BLOB) as T1(c1) 

INSERT INTO @tempTable 
SELECT 
    Tbl.Col.value('subelement[1]/@code', 'NVARCHAR(MAX)'), 
    Tbl.Col.value('subelement[1]', 'NVARCHAR(MAX)') 
FROM @xml.nodes('//element') Tbl(Col) 

SELECT * FROM @tempTable 

Các truy vấn, khi được thực thi, đưa ra một hàng với cột ValueCode chứa NULL và cột Giá trị có chứa 'value1value2'. Những gì tôi muốn nhận được sẽ là các thuộc tính và các giá trị nối với một dấu phân tách. Ví dụ, tôi cần ValueCode để chứa 'code1; code2 'và Giá trị để chứa' giá trị 1; giá trị2 '. Làm thế nào tôi có thể đạt được điều đó?

Trả lời

5

bạn có thể sử dụng xuery nếu bạn muốn chuỗi nối:

SELECT 
    Tbl.Col.query('for $i in value return concat($i/text()[1], ";")').value('.', 'nvarchar(max)'), 
    Tbl.Col.query('for $i in value return concat($i/@code, ";")').value('.', 'nvarchar(max)') 
FROM @xml.nodes('root/element/subelement') Tbl(Col); 

nếu bạn muốn giá trị của bạn thành hàng:

SELECT 
    Tbl.Col.value('.', 'nvarchar(max)'), 
    Tbl.Col.value('@code', 'nvarchar(max)') 
FROM @xml.nodes('root/element/subelement/value') Tbl(Col); 

sql fiddle demo