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ị.
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ế. –
@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
[Gợi ý] (http://msdn.microsoft.com/en-us/library/ms189885.aspx) –