2012-07-28 36 views
14

我有我的SQL SERVER數據庫串聯XML沒有類型轉換爲字符串

<XMLData> 
... 
<Type>1</Type> 
... 
</XMLData> 

<XMLData> 
... 
<Type>2</Type> 
... 
</XMLData> 

<XMLData> 
... 
<Type>3</Type> 
... 
</XMLData> 

最終輸出各種表格生成以下XML我需要的是單人組合如下:

<AllMyData> 
    <XMLData> 
     ... 
     <Type>1</Type> 
     ... 
    </XMLData> 
    <XMLData> 
     ... 
     <Type>2</Type> 
     ... 
    </XMLData> 
    <XMLData> 
     ... 
     <Type>3</Type> 
     ... 
    </XMLData> 
<AllMyData> 

注 - 我組合的所有獨立元素都具有相同的標籤名稱。

在此先感謝您查看此信息。

回答

14

我有我的SQL SERVER數據庫的各種表格生成以下XML

取決於你如何擁有它,但如果它在一個XML變量中,你可以這樣做。

declare @XML1 xml 
declare @XML2 xml 
declare @XML3 xml 

set @XML1 = '<XMLData><Type>1</Type></XMLData>' 
set @XML2 = '<XMLData><Type>2</Type></XMLData>' 
set @XML3 = '<XMLData><Type>3</Type></XMLData>' 

select @XML1, @XML2, @XML3 
for xml path('AllMyData') 
5

如果您使用for xml type,則可以合併XML列而不投射它們。例如:

select * 
from (
     select (
       select 1 as Type 
       for xml path(''), type 
       ) 
     union all 
     select (
       select 2 as Type 
       for xml path(''), type 
       ) 
     union all 
     select (
       select 3 as Type 
       for xml path(''), type 
       ) 
     ) as Data(XmlData) 
for xml path(''), root('AllMyData'), type 

此打印:

<AllMyData> 
    <XmlData> 
     <Type>1</Type> 
    </XmlData> 
    <XmlData> 
     <Type>2</Type> 
    </XmlData> 
    <XmlData> 
     <Type>3</Type> 
    </XmlData> 
</AllMyData> 
3

作爲附錄的Mikael埃裏克森的答案 - 如果你有,你需要不斷地添加節點,然後想組一個過程,一個節點下,這是做這件事:

declare @XML1 XML 
declare @XML2 XML 
declare @XML3 XML 
declare @XMLSummary XML 

set @XML1 = '<XMLData><Type>1</Type></XMLData>' 
set @XMLSummary = (SELECT @XMLSummary, @XML1 FOR XML PATH('')) 

set @XML2 = '<XMLData><Type>2</Type></XMLData>' 
set @XMLSummary = (SELECT @XMLSummary, @XML2 FOR XML PATH('')) 

set @XML3 = '<XMLData><Type>3</Type></XMLData>' 
set @XMLSummary = (SELECT @XMLSummary, @XML3 FOR XML PATH('')) 


SELECT @XMLSummary FOR XML PATH('AllMyData') 
1

我需要做同樣的事情,但不知道有多少行/變量有關,沒有額外的模式添加,所以這裏是我的解決方案。遵循這種模式,我可以根據需要生成儘可能多的代碼片段,將它們合併,在PROCS之間傳遞它們,甚至可以將它們從proc中返回,並在任何時候將它們包裝在容器中,而不用修改數據,也不必強制將XML結構添加到我的數據。我將這種方法與HTTP端點一起使用來提供XML Web服務,並使用另一種將XML轉換爲JSON的技巧來提供JSON WebServices。

-- SETUP A type (or use this design for a Table Variable) to temporarily store snippets into. The pattern can be repeated to pass/store snippets to build 
    -- larger elements and those can be further combined following the pattern. 
    CREATE TYPE [dbo].[XMLRes] AS TABLE(
     [xmlResult] [xml] NULL 
    ) 
    GO 


    -- Call the following as much as you like to build up all the elements you want included in the larger element 
    INSERT INTO @XMLRes (xmlResult) 
     SELECT 
      ( 
       SELECT 
        'foo' '@bar' 
       FOR XML 
        PATH('SomeTopLevelElement') 
      ) 

    -- This is the key to "concatenating" many snippets into a larger element. At the end of this, add " ,ROOT('DocumentRoot') " to wrapp them up in another element even 
    -- The outer select is a time from user2503764 that controls the output column name 

    SELECT (
    SELECT XmlData as [*] 
    FROM 
     (
     SELECT 
      xmlResult AS [*] 
     FROM 
      @XmlRes 
     WHERE 
      xmlResult IS NOT NULL 
     FOR XML PATH(''), TYPE 
     ) as DATA(XmlData) 
    FOR XML PATH('') 
    ) as [someColumnName] 
6

我不能評論,但可以回答,所以即使我認爲評論更合適,我會擴展什麼rainabba回答上面添加更多的控制。我的.Net代碼需要知道返回的列名,所以我不能依賴自動生成的名稱,但需要上面提供的提示rainabba。

通過這種方式,xml可以有效地連接成單行,並將結果列命名。您可以使用相同的方法將結果分配給XML變量,並從PROC返回。

SELECT (
SELECT XmlData as [*] 
FROM 
    (
    SELECT 
     xmlResult AS [*] 
    FROM 
     @XmlRes 
    WHERE 
     xmlResult IS NOT NULL 
    FOR XML PATH(''), TYPE 
    ) as DATA(XmlData) 
FOR XML PATH('') 
) as [someColumnName] 
+0

很好的補充。謝謝。你可能無法評論,因爲你還沒有足夠的代表。 StackOverflow和類似網站的catch-22之一。 – rainabba 2013-10-01 00:48:17

+0

謝謝!我現在可以在這裏發表評論(因爲這是我的回答?) – user2503764 2013-10-01 00:49:04

0

ALTER PROCEDURE usp_fillHDDT @code詮釋

AS BEGIN

DECLARE @HD XML,@ DT XML;

SET NOCOUNT ON; 
select invhdcode, invInvoiceNO,invDate,invCusCode,InvAmount into #HD 
from dbo.trnInvoiceHD where [email protected] 

select invdtSlNo No,invdtitemcode ItemCode,invdtitemcode ItemName, 
invDtRate Rate,invDtQty Qty,invDtAmount Amount ,'Kg' Unit into #DT from 
dbo.trnInvoiceDt where [email protected] 

set @HD = (select * from #HD HD FOR XML AUTO,ELEMENTS XSINIL); 
set @DT = (select* from #DT DT FOR XML AUTO,ELEMENTS XSINIL); 

SELECT CAST ('<OUTPUT>'+ CAST (ISNULL(@HD,'') AS VARCHAR(MAX))+ CAST (ISNULL(@DT,'') AS VARCHAR(MAX))+ '</OUTPUT>' AS XML) 

END

-1
public String ReplaceSpecialChar(String inStr) 
{ 
    inStr = inStr.Replace("&", "&amp;"); 
    inStr = inStr.Replace("<", "&lt;"); 
    inStr = inStr.Replace(">", "&gt;"); 
    inStr = inStr.Replace("'", "&#39;"); 
    inStr = inStr.Replace("\"", "&quot;"); 
    return inStr; 
}