2013-02-01 32 views
5

Đây là câu hỏi 'cho xml' khác, nhưng tôi không chắc liệu điều này có thể được thực hiện mà không có chế độ tường minh hay không. Nếu không thể, thì tôi sẽ phải sống với nó.SQL Server 'FOR XML' nhận giá trị vào nút phần tử "hàng"

Sau đây là chọn hiện tuyên bố của tôi:

SELECT 
     [stream_id] as '@stream_id', 
     [path_locator] as '@path_locator', 
     [parent_path_locator] as '@parent_path_locatr', 
     [file_type] as '@file_type', 
     [cached_file_size] as '@cached_file_size', 
     [creation_time] as '@creation_time', 
     [last_write_time] as '@last_write_time', 
     [last_access_time] as '@last_access_time', 
     [is_directory] as '@is_directory', 
     [is_offline] as '@is_offline', 
     [is_hidden] as '@is_hidden', 
     [is_readonly] as '@is_readonly', 
     [is_archive] as '@is_archive', 
     [is_system] as '@is_system', 
     [is_temporary] as '@is_temporary', 
     [name] as '/name', 
     dbo.udf_GetChildren(path_locator) 
    FROM @Merged 
    WHERE path_locator.GetLevel() = 1 
    FOR XML PATH'file'), ROOT('files'), TYPE 

này kết quả đầu ra xml sau:

<files> 
    <file stream_id="" etc...> 
     <name>NAME</name> 
    </file> 
</files> 

Đây không phải là xấu, nhưng những gì tôi thực sự muốn là để có được những name giá trị của phần tử làm giá trị của tệp phần tử. Đây là một nhiệm vụ đơn giản như vậy, tôi cho rằng nó có thể được thực hiện mà không có chế độ tường minh, nhưng tôi đã sai khá thường xuyên về những thứ như vậy.

Tôi đã thử sử dụng dấu '/', nhưng điều này dường như không có hiệu ứng tôi muốn (ví dụ: Update XML node (in an XML column) in SQL Server 2005 with another column value in the same row).

chỉnh sửa: Các xml mong muốn sẽ là đơn giản này:

<files> 
    <file stream_id="" etc...>NAME</file> 
</files> 

Rất cám ơn sự giúp đỡ.

+0

Bạn có thể hiển thị một ví dụ về đầu ra XML mong muốn? –

+0

@AdamWenger đã hoàn tất. Cảm ơn. – dansan

+1

Bạn đã thử 'tên là '*'' chưa? –

Trả lời

3
+0

+1, Giải pháp đơn giản –

+0

@Adam có nhiều cách để làm da mèo. Tất cả câu trả lời ở đây sẽ thực hiện công việc để +1 cho tất cả các bạn :) –

2

Tôi nghĩ bạn phải xóa Tên cột khỏi trường - tôi có thể thực hiện việc này với việc phối hợp một khoảng trống vào cuối. Đây là phiên bản cô đọng mà bạn có thể làm việc với ví dụ trên:

SELECT name + '' 
FROM TestXML 
FOR XML PATH('file') 

Và đây là SQL Fiddle.

Và một bài viết tốt về nó:

http://msdn.microsoft.com/en-us/library/bb510469.aspx

Dưới đây là với truy vấn trên của bạn:

SELECT 
    [stream_id] as '@stream_id', 
    [path_locator] as '@path_locator', 
    [parent_path_locator] as '@parent_path_locatr', 
    [file_type] as '@file_type', 
    [cached_file_size] as '@cached_file_size', 
    [creation_time] as '@creation_time', 
    [last_write_time] as '@last_write_time', 
    [last_access_time] as '@last_access_time', 
    [is_directory] as '@is_directory', 
    [is_offline] as '@is_offline', 
    [is_hidden] as '@is_hidden', 
    [is_readonly] as '@is_readonly', 
    [is_archive] as '@is_archive', 
    [is_system] as '@is_system', 
    [is_temporary] as '@is_temporary', 
    [name] + '', 
    dbo.udf_GetChildren(path_locator) 
FROM @Merged 
WHERE path_locator.GetLevel() = 1 
FOR XML PATH'file'), ROOT('files'), TYPE 

Chúc may mắn.

1

Tôi di chuyển các file nút cho mỗi cột:

SELECT [stream_id] AS 'file/@stream_id' 
    , [is_system] AS 'file/@is_system' 
    , [is_temporary] AS 'file/@is_temporary' 
    ... 
    , [name] AS 'file' 
FROM Merged 
FOR XML PATH('files'), TYPE; 
Các vấn đề liên quan