17

SQL SERVER データベースのさまざまなテーブルから生成された次の XML があります。

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

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

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

私が必要とする最終的な出力は、次のように結合された単一です。

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

注 - 結合しているすべての独立した要素は、同じタグ名を持っています。

これを調べてくれてありがとう。

4

7 に答える 7

19

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')
于 2012-07-28T09:58:33.143 に答える
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]
于 2013-10-01T00:47:03.380 に答える
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>
于 2012-07-28T09:49:34.013 に答える
3

Mikael Erikssonの回答の補足として-ノードを継続的に追加する必要があり、それを単一のノードの下にグループ化する必要があるプロセスがある場合、これはそれを行う1つの方法です。

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')
于 2013-02-26T16:03:54.443 に答える
1

私は同じことをする必要がありましたが、関係する行/変数の数を知らず、余分なスキーマを追加することなく、ここに私の解決策がありました. このパターンに従って、必要な数のスニペットを生成し、それらを結合し、PROCS 間で渡したり、procs から返したりすることができます。また、データを変更したり、XML 構造を強制的に追加したりすることなく、いつでもコンテナーにラップできます。私のデータ。このアプローチを HTTP エンドポイントで使用して XML Web サービスを提供し、XML を JSON に変換する別の手法を使用して JSON Web サービスを提供します。

    -- 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]
于 2013-10-01T00:17:44.843 に答える
0
ALTER PROCEDURE usp_fillHDDT @Code  int

AS
BEGIN

 DECLARE @HD XML,@DT XML;  

    SET NOCOUNT ON;
    select invhdcode, invInvoiceNO,invDate,invCusCode,InvAmount into #HD
    from dbo.trnInvoiceHD where invhdcode=@Code

    select invdtSlNo No,invdtitemcode ItemCode,invdtitemcode ItemName,
    invDtRate Rate,invDtQty Qty,invDtAmount Amount ,'Kg' Unit into #DT from
     dbo.trnInvoiceDt  where invDtTrncode=@Code 

    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
于 2015-03-23T21:04:50.943 に答える
-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;
}
于 2015-03-25T04:04:50.177 に答える