2011-12-13 35 views
5

Không thể để có được đầu ra XML mong muốnTSQL FOR XML EXPLICIT

Sau đây:

SELECT 1 as Tag, 
      0 as Parent, 
      sID  as [Document!1!sID], 
      docID  as [Document!1!docID], 
      null  as [To!2!value] 
    FROM docSVsys with (nolock) 
    where docSVsys.sID = '57' 
    UNION ALL 
    SELECT 2 as Tag, 
     1 as Parent, 
     sID, 
     NULL, 
     value   
    FROM docMVtext 
    WHERE docMVtext.sID = '57' 
    ORDER BY [Document!1!sID],[To!2!value] 
    FOR XML EXPLICIT; 

Tạo:

<Document sID="57" docID="3.818919.C41P3UKK00BRICLAY0AR1ET2EBPYSU4SA"> 
     <To value="Frank Ermis" /> 
     <To value="Keith Holst" /> 
     <To value="Mike Grigsby" /> 
    </Document> 

Những gì tôi muốn là:

<Document sID="57"> 
     <docID>3.818919.C41P3UKK00BRICLAY0AR1ET2EBPYSU4SA</docID> 
     <To> 
     <Value>Frank Ermis</Value> 
     <Value>Keith Holst</Value> 
     <Value>Mike Grigsby</Value> 
     </To> 
    </Document> 

Tôi có thể nhận được kết quả đó với FOR XML không?

Ok tôi nhận được chúng có thể tương đương về mặt kỹ thuật.
Điều tôi muốn và những gì tôi cần không giống nhau.

Sử dụng xDocument cho điều này là SLOW.
Có hàng triệu tài liệu và cần XML tới 1 triệu lần mỗi lần cho XML.
TSQL FOR XML là siêu nhanh.
Tôi chỉ cần tải FOR XML để định dạng.

Giải pháp (dựa trên câu trả lời được chấp nhận):

SELECT top 4 
    [sv].[sID] AS '@sID' 
    ,[sv].[sParID] AS '@sParID' 
    ,[sv].[docID] AS 'docID' 
    ,[sv].addDate as 'addDate' 
    ,(SELECT [value] AS 'value' 
     FROM [docMVtext] as [mv] 
     WHERE [mv].[sID] = [sv].[sID] 
     AND [mv].[fieldID] = '113' 
     ORDER BY [mv].[value] 
     FOR XML PATH (''), type 
    ) AS "To" 
    ,(SELECT [value] AS 'value' 
     FROM [docMVtext] as [mv] 
     WHERE [mv].[sID] = [sv].[sID] 
     AND [mv].[fieldID] = '130' 
     ORDER BY [mv].[value] 
     FOR XML PATH (''), type 
    ) AS "MVtest" 
    FROM [docSVsys] as [sv] 
    WHERE [sv].[sID] >= '57' 
    ORDER BY 
     [sv].[sParID], [sv].[sID] 
    FOR XML PATH('Document'), root('Documents') 

Tạo:

<Documents> 
    <Document sID="57" sParID="57"> 
    <docID>3.818919.C41P3UKK00BRICLAY0AR1ET2EBPYSU4SA</docID> 
    <addDate>2011-10-28T12:26:00</addDate> 
    <To> 
     <value>Frank Ermis</value> 
     <value>Keith Holst</value> 
     <value>Mike Grigsby</value> 
    </To> 
    <MVtest> 
     <value>MV test 01</value> 
     <value>MV test 02</value> 
     <value>MV test 03</value> 
     <value>MV test 04</value> 
    </MVtest> 
    </Document> 
    <Document sID="58" sParID="57"> 
    <docID>3.818919.C41P3UKK00BRICLAY0AR1ET2EBPYSU4SA.1</docID> 
    <addDate>2011-10-28T12:26:00</addDate> 
    </Document> 
    <Document sID="59" sParID="59"> 
    <docID>3.818920.KJKP5LYKTNIODOEI4JDOKJ2BXJI5P0BIA</docID> 
    <addDate>2011-10-28T12:26:00</addDate> 
    <To> 
     <value>Vladimir Gorny</value> 
    </To> 
    </Document> 
    <Document sID="60" sParID="59"> 
    <docID>3.818920.KJKP5LYKTNIODOEI4JDOKJ2BXJI5P0BIA.1</docID> 
    <addDate>2011-10-28T12:26:00</addDate> 
    </Document> 
</Documents> 

Bây giờ những gì tôi cần làm là thêm một thuộc tính DispName tới phần tử MVtext. Thuộc tính không thể có bất kỳ khoảng trống nào và tôi muốn bao gồm tên thân thiện, ví dụ: Văn bản đa giá trị.

+4

Bạn không bao giờ nên sử dụng FOR XML EXPLICIT. Nó là một cơn ác mộng. Bạn đang sử dụng SQL Server 2008, vì vậy hãy sử dụng "FOR XML PATH" để thay thế. –

+0

@JohnSaunders OK John, cho tôi một gợi ý. Tôi mệt mỏi XML PATH và không có nơi nào. – Paparazzi

+0

[Gợi ý] (http://msdn.microsoft.com/en-us/library/ms189885.aspx) –

Trả lời

3

Hãy thử một cái gì đó như thế này (chưa được kiểm tra, vì tôi không có bảng cơ sở dữ liệu của bạn để kiểm tra chống lại ...):

SELECT 
    sv.sID AS '@sID', 
    sv.docID AS 'docID', 
    (SELECT 
     value AS 'value' 
     FROM 
     dbo.docMVtext mv 
     WHERE 
     mv.sID = sv.sID 
     ORDER BY mv.value 
     FOR XML PATH (''), TYPE) AS 'To'  
    FROM 
     dbo.docSVsys sv 
    WHERE 
     sv.sID = '57' 
    ORDER BY 
     sv.sID 
    FOR XML PATH('Document') 

Liệu rằng cung cấp cho bạn những gì Bạn đang tìm?? Và bạn không đồng ý với John và tôi: đây là đơn giản hơn nhiều hơn FOR XML EXPLICIT .....

+0

Đó là tất cả khó khăn khi nó không hoạt động. Mã của bạn đã đóng. Chỉ thiếu dấu phẩy ở cuối dòng thứ ba. Tôi có một bài viết liên quan bây giờ về làm thế nào để có được một thuộc tính giá trị duy nhất trong 'To' – Paparazzi

+0

Ồ, tôi đã gần như có trước khi tôi đăng câu hỏi này. Tôi đã bỏ lỡ ", TYPE". – Paparazzi

2

Từ Examples: Using PATH Mode:

USE AdventureWorks2008R2; 
GO 
SELECT ProductModelID AS "@ProductModelID", 
     Name AS "@ProductModelName", 
     (SELECT ProductID AS "data()" 
     FROM Production.Product 
     WHERE Production.Product.ProductModelID = 
       Production.ProductModel.ProductModelID 
     FOR XML PATH ('') 
     ) AS "@ProductIDs", 
     (
     SELECT Name AS "ProductName" 
     FROM Production.Product 
     WHERE Production.Product.ProductModelID = 
       Production.ProductModel.ProductModelID 
     FOR XML PATH (''), type 
     ) AS "ProductNames" 

FROM Production.ProductModel 
WHERE ProductModelID= 7 OR ProductModelID=9 
FOR XML PATH('ProductModelData'); 
Các vấn đề liên quan