3

SQL Server 2005 に単純なテーブルがあり、これを XML に変換したいと考えています ("FOR XML" 句を使用)。XML を必要な出力のように表示するのに問題があります。

ウェブ上のさまざまなチュートリアルを調べてみましたが、苦労しています。誰か助けてくれませんか?

私が持っているテーブルはこのように見えます

TYPE,GROUP,VALUE
Books,Hardback,56
Books,Softcover,34
CDs,Singles,45
CDS,Multis,78

必要な出力スタイルは次のとおりです。

<data>
  <variable name="TYPE">
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
  </variable>
 <variable name="TYPE">
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
  </variable>
</data>

編集: 私が知る限り、複数の値が必要です。Xcelsius ( Linking XML and Xcelsius ) で使用する XML を生成しているため、XML のフォーマットを制御できません。リンクされたチュートリアルに従って ASP を使用して XML を生成できますが、SQL Server から直接取得することを望んでいました。

編集 2: エレガントで整頓されたものを望んでいましたが、ゴデケの例が最も近かったです。SQLをいじって、私が思いついた:

select
   "type" as '@name', 
   "group" as 'row/column',
   null as 'row/tmp', 
   "value" as 'row/column'
from tableName
for xml path('variable'), root('data')

私が望んでいたほぼ正確な方法で出力します。null/tmp 行は出力さえしません。連結を妨げているだけです。それでも、タグ<variable name="TYPE">は行ごとに繰り返されますが、これはできません。

4

3 に答える 3

2

私が得ることができる限り、これは次のとおりです。

select "type" as '@name', "group" as 'row/column1', "value" as 'row/column2'
from tableName
for xml path('variable'), root('data')

2 つの項目 ("column" と "column") に同じ名前を付けることは、1 回のパスで行う方法を私が知っていることではありませんが、一方で、それは奇妙な XML スキーマの選択です。通常、要素に個別のデータが含まれている場合、要素には一意の名前が付けられます。明白な選択 (両方に「行/列」という名前を付ける) は、出力でそれらを 1 つの値に連結するだけです。

また、返される各行は、他の行とは異なる「変数」要素になることに注意してください。冗長なレコードなしでネストを取得するには、サブクエリが必要です。

select distinct "type" as '@name'
from Agent
for xml path('variable'), root('data')

が私の最初の考えでしたが、別のものは入れ子を防ぎます。

以上のことから、必要な正確な出力を得るには、EXPLICIT モードを使用する必要があるかもしれないと思います。おそらく私の問題は、コードでDOMDocumentをパントして使用するようなものです:)。

于 2008-10-30T22:59:33.097 に答える
1

私はXML PATHに使用することを好みます。要素などを制御するためのより良い方法を提供します.

見る

しかし、これはかなり厄介です

 /*
create table #tablename
(
[type] varchar(20),
[group] varchar(20),
[value] varchar(20)
)

insert into #tablename select 'type1','group11','value111'
insert into #tablename select 'type1','group11','value112'
insert into #tablename select 'type1','group12','value121'
insert into #tablename select 'type1','group12','value122'
insert into #tablename select 'type2','group21','value211'
insert into #tablename select 'type2','group21','value212'
insert into #tablename select 'type2','group22','value221'
insert into #tablename select 'type2','group22','value222'

alter table #tablename add id uniqueidentifier

update #tablename set id = newid()
*/

select [type] as '@name',
    (select     
        (select [column] from
            (
                select [group] as 'column', tbn1.type, tbn2.[group]
               from #tablename tbn3 WHERE tbn3.type = tbn1.type and tbn2.[group] =  tbn3.[group]
               union
         select [value], tbn1.type, tbn2.[group]
              from #tablename tbn3 WHERE tbn3.type = tbn1.type and tbn2.[group] = tbn3.[group]
            ) as s
        for xml path(''),type 
        )
    from #tablename tbn2 
    where tbn2.type = tbn1.type
    for xml path('row3'), type
)

from #tableName tbn1 
GROUP BY [type]
for xml path('variable'), root('data') 

あなたが私に求めているものをあなたに与えますが、エレガントで整頓されていません.

于 2008-10-30T22:41:09.297 に答える
0

以下のスクリプトは、目的の形式を生成します


<DATA>
    <VARIABLE TYPE = "Books">
      <row TYPE ="Books">
        <GROUP>ハードカバー</GROUP>
        <VALUE> 56 </ VALUE>
      </ row>
      <row TYPE = "Books">
        <GROUP>ソフトカバー</GROUP>
        <VALUE> 34 </ VALUE>
      </ row>
    </ VARIABLE>
    <VARIABLE TYPE = "CDs">
      <row TYPE ="CDs">
        <GROUP>シングル</GROUP>
        <VALUE> 45 < / VALUE>
      </ row>
      <row TYPE ="CDS">
        <GROUP>マルチ</GROUP>
        < VALUE> 78 </ VALUE>
      </ row>
    </ VARIABLE>
</ DATA>

呼び出す


DECLARE @tblItems table (
    [TYPE] varchar(50)
    ,[GROUP] varchar(50)
    ,[VALUE] int
)

DECLARE @tblShredded table (
    [TYPE] varchar(50)
    ,[XmlItem] xml
)

DECLARE @xmlGroupValueTuples xml

insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'Books','Hardback',56)
insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'Books','Softcover',34)
insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'CDs','Singles',45)
insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'CDS','Multis',78)

SET @xmlGroupValueTuples =
  (
    SELECT
      "@TYPE" = [TYPE]
      ,[GROUP]
      ,[VALUE]
    FROM @tblItems
    FOR XML PATH('row'), root('Root')
  )

INSERT @tblShredded([TYPE], XmlItem)
SELECT
    [TYPE] = XmlItem.value('./row[1]/@TYPE', 'varchar(50)')
    ,XmlItem
FROM dbo.tvfShredGetOneColumnedTableOfXmlItems(@xmlGroupValueTuples)


SELECT
  (
    SELECT
      VARIABLE =
        (
          SELECT
            "@TYPE" = t.[TYPE]

            ,(
              SELECT
                tInner.XmlItem.query('./child::*')
              FROM @tblShredded tInner
              WHERE tInner.[TYPE] = t.[TYPE]
              FOR XML PATH(''), ELEMENTS, type
            )
          FOR XML PATH('VARIABLE'),type
        )
  )
FROM @tblShredded t
GROUP BY
    t.[TYPE]
FOR XML PATH(''), ROOT('DATA')

どこ


-- Example Inputs
/*
DECLARE @xmlListFormat xml
SET @xmlListFormat =
    '
        <XmlListRoot>
            <Item>004421UB7</Item>
            <Item>59020UH24</Item>
            <Item>542514NA8</Item>
        </XmlListRoot>
    '
*/

-- =============================================
-- Author: 6eorge Jetson
-- Create date: 01/22/3003
-- Description: Shreds an input XML list conforming to the expected list schema
-- =============================================
CREATE FUNCTION [dbo].[tvfShredGetOneColumnedTableOfXmlItems] (@xmlListFormat xml)
RETURNS
@tblResults TABLE (XmlItem xml)
AS
BEGIN

    INSERT @tblResults
    SELECT
        tblShredded.colXmlItem.query('.') as XmlItem
    FROM
        @xmlListFormat.nodes('/child::*/child::*') as tblShredded(colXmlItem)

    RETURN
END
于 2008-10-31T01:40:11.557 に答える