2014-05-23 26 views
1

我想寫一個sql查詢,將生成xml格式,我可以轉換爲excel電子表格。所以原來的SQL表包含以下數據選擇爲XML語句生成excel sheetData格式

id Run  Name Outcome 
1 Run1 Test1 1 
2 Run2 Test2 2 

SQL查詢我設法生產出迄今如下

select * from 
(
    SELECT * from table1 
) t 
    for xml path('row'), root('sheetData') 

這將產生以下XML

<sheetData> 
    <row r="1"> 
    <Run>Run1</Run> 
    <Name>Test1</Name> 
    <Outcome>1</Outcome> 
    </row> 
    <row r="2"> 
    <Run>Run2</Run> 
    <Name>Test2</Name> 
    <Outcome>2</Outcome> 
    </row> 
</sheetData> 

那麼什麼我需要得到的是以下xml格式

<?xml version="1.0" encoding="UTF-8"?> 
<sheetData> 
    <row r="1"> 
     <c r="A1" t="inlineStr"> 
     <is> 
      <t>Run1</t> 
     </is> 
     </c> 
     <c r="B1" t="inlineStr"> 
     <is> 
      <t>Test1</t> 
     </is> 
     </c> 
     <c r="C1" t="inlineStr"> 
     <is> 
      <t>1</t> 
     </is> 
     </c>  
    </row> 
    <row r="2"> 
     <c r="A2" t="inlineStr"> 
     <is> 
      <t>Run2</t> 
     </is> 
     </c> 
     <c r="B2" t="inlineStr"> 
     <is> 
      <t>Test2</t> 
     </is> 
     </c> 
     <c r="C2" t="inlineStr"> 
     <is> 
      <t>2</t> 
     </is> 
     </c>  
    </row> 
</sheetData> 

現在我已經採取了第一種xml格式的轉換來獲得所需的輸出,但是我希望能夠構建一個sql查詢,我可以直接使用它來生成此查詢,而無需通過額外的轉換。謝謝你的幫助。

+0

這聽起來更像一個SQL問題,而不是一個XSLT的問題,所以它可能是值得除去'xslt'標籤,以及添加一個'sql'(或'叔sql')標籤來代替。 –

+0

替換爲t-sql。感謝指針。 – allan

回答

1

以下將做你想要的。

DECLARE @Data TABLE (
    [id] INT, 
    [Run] NVARCHAR(20), 
    [Name] NVARCHAR(20), 
    [Outcome] INT 
) 

INSERT INTO 
    @Data ([id], [Run], [Name], [Outcome]) 
VALUES 
    (1, 'Run1', 'Test1', 1), 
    (2, 'Run2', 'Test2', 2) 

DECLARE @Xml XML = (
    SELECT 
     [Id] AS [@r], 
     (SELECT 
      'A'+CONVERT(nvarchar(20), [Id]) AS [@r], 
      'inlineStr' AS [@t], 
      (SELECT 
       [Run] AS [t] 
      FOR XML PATH('is'), TYPE) 
     FOR XML PATH('c'), TYPE), 

     (SELECT 
      'B'+CONVERT(nvarchar(20), [Id]) AS [@r], 
      'inlineStr' AS [@t], 
      (SELECT 
       [Name] AS [t] 
      FOR XML PATH('is'), TYPE) 
     FOR XML PATH('c'), TYPE), 

     (SELECT 
      'C'+CONVERT(nvarchar(20), [Id]) AS [@r], 
      'inlineStr' AS [@t], 
      (SELECT 
       [Outcome] AS [t] 
      FOR XML PATH('is'), TYPE) 
     FOR XML PATH('c'), TYPE) 

    FROM 
     @Data 
    FOR XML PATH('row'), ROOT('sheetData'), TYPE 
) 
SELECT 
    '<?xml version="1.0" encoding="UTF-8"?>' 
    +CONVERT(NVARCHAR(MAX), @Xml) 
+0

這確實會產生所需的輸出。我需要調整它,所以我可以使它更通用,超越四列。 – allan