2012-02-17 10 views
1

こんにちは私はXMLを出力するためにデータベースを取得しようとしていますが、やや成功しています。私はキャストを使用するか、または変換するときにこれは、しかし、必要なXMLXML自動問題のためのSQLサーバー

を生成

for xml auto, root('MyRoot') 

:私は様々で標準を選択します

は、電気ショック療法合流し、すべてが正常に動作し、私は次の行を追加します私のタグの中の1つを選択すると、その親に結合されてしまいます。なぜか、どうやってそれを修正するのか分かりません。他のすべては完璧です。以下は

は、私はそれが

select Tbl1.id, 
     'xyz ' as [randCol], 
     Tbl2.id, 
     Tbl2.name, 
     aDate as [date] --(aDate is the date field, date here is not data type, but a colum name for output) 
from dbo.table1 as Tbl1 
inner join dbo.table3 as Tbl3 
on Tbl1.id = Tbl3.table1id 
inner join table2 as Tbl2 
on Tbl3.table2id = Tbl2.id 
where Tbl1.id = 1 

for xml auto, root('MyRoot') 

だから、結果のXMLは次のようであるたいとXMLを出力コードです:

<MyRoot> 
    <Tbl1 id="1" randCol="xyz "> 
    <Tbl2 id="10001" name="John"> 
     <Tbl3 date="2011-10-19T22:59:00" /> 
    </Tbl2> 
    <Tbl2 id="10002" name="Brian"> 
     <Tbl3 date="2011-10-19T22:59:00" /> 
    </Tbl2> 
    <Tbl2 id="10003" name="Jimmy"> 
     <Tbl3 date="2011-05-19T23:00:00" /> 
    </Tbl2> 
    </Tbl1> 
</MyRoot> 

問題は、私は、日付として」ADATEを交換するとき"私のXMLが台無しになる日付を書式設定するために、次の行を付けてください。

CONVERT(date,aDate) as [date] 

これは次の出力を発生します

この変化と私は日付を取得するために行うのですか、私はそれ望むようにフォーマットされ、のように別の行にそれを維持を起こしたものは
<MyRoot> 
    <Tbl1 id="1" randCol="xyz "> 
    <Tbl2 id="10001" name="dave" date="2010-11-17" /> 
    <Tbl2 id="10002" name="harry" date="2010-11-16" /> 
    <Tbl2 id="10003" name="lenny" date="2010-06-15" /> 
    </Tbl1> 
</MyRoot> 

最初の例。

EDIT2:以下、DBのERDが(私はERDの説明を取り出して、ちょうどERDを入れても、いくつかのサンプルデータである:。後は私のxmlにしたいデータセットです

id randCol id  name  date 
1  xyz  10001  John  2011-10-19 
1  xyz  10002  Brian  2011-10-19 
1  xyz  10003  Jimmy  2011-05-19 

選択*との完全なデータセットの実行には、次のように表示されます(参加する説明の目的のために)

id table1id table2id aDate     id  name 
1 1   10001  2011-10-19 22:59:00 10001 John 
1 1   10002  2011-10-19 22:59:00 10002 Brian 
1 1   10003  2011-05-19 23:00:00 10003 Jimmy 

enter image description here

は私がacheiveしようとしていることです。次の形式のXML出力。

<MyRoot> 
    <Tbl1 id="1" randCol="xyz "> 
    <Tbl2 id="10001" name="John"> 
     <Tbl3 date="2011-10-19" /> 
    </Tbl2> 
    <Tbl2 id="10002" name="Brian"> 
     <Tbl3 date="2011-10-19" /> 
    </Tbl2> 
    <Tbl2 id="10003" name="Jimmy"> 
     <Tbl3 date="2011-05-19" /> 
    </Tbl2> 
    </Tbl1> 
</MyRoot> 

は、しかし、私はExplisitを使用せずにこれをacheiveする必要があるので、私は生、自動またはパスを使用して、そしてprametersのどのような組み合わせですべきかどうかを知る必要があります。

+0

問題を引き起こしている全体的なクエリを表示できますか?日付、日付、日付はどのようなものですか? –

+0

aDateは実際にTbl3で定義されていますか? –

答えて

1

私は問題は、変換では(複雑な関数の場合と同じように)、結果の列はもはやTbl3に属していないと考えています(複数のテーブルから列を取り、に?)。 Using AUTO Modeと言うと、

これは、クエリ結果から生成されたXMLの形状をあまり制御できません。 ...明示モードを使用してパス・モードを使用すると、より多くの制御

とを提供SELECT句の列がの場合のように、FROM節において同定テーブルのいずれかに関連付けることができない

集約列または計算列の場合は、リスト内で遭遇したときに最も深いネスティングレベルでXML文書に追加されます。そのような列がSELECT句の最初の列として表示される場合は、その列が先頭の要素に追加されます。

だから私はPATHに切り替えることをお勧めします。

declare @table1 table (
    id int not null 
) 
declare @table2 table (
    id int not null, 
    name varchar(10) not null 
) 
declare @table3 table (
    table1id int not null, 
    table2id int not null, 
    aDate datetime not null 
) 

insert into @table1 (id) select 1 
insert into @table2 (id,name) select 10001,'John' union all select 10002,'Brian' union all select 10003,'Jimmy' 
insert into @table3 (table1id,table2id,aDate) 
select 1,10001,'2011-10-19T22:59:00' union all 
select 1,10002,'2011-10-19T22:59:00' union all 
select 1,10003,'2011-05-19T23:00:00' 
select Tbl1.id as [@id], 
     'xyz ' as [@randCol], 
     (select 
      Tbl2.id as [@id], 
      Tbl2.name as [@name], 
      CONVERT(date,aDate) as [Tbl3/@date] --(aDate is the date field, date here is not data type, but a colum name for output) 
     from 
      @table3 as Tbl3 
      inner join 
      @table2 as Tbl2 
      on 
       Tbl3.table2id = Tbl2.id 
     where 
      Tbl1.id = Tbl3.table1id 
     for xml path('Tbl2'), type) 
from @table1 as Tbl1 
where Tbl1.id = 1 

for xml path('Tbl1'), root('MyRoot') 

結果:

<MyRoot> 
    <Tbl1 id="1" randCol="xyz "> 
    <Tbl2 id="10001" name="John"> 
     <Tbl3 date="2011-10-19" /> 
    </Tbl2> 
    <Tbl2 id="10002" name="Brian"> 
     <Tbl3 date="2011-10-19" /> 
    </Tbl2> 
    <Tbl2 id="10003" name="Jimmy"> 
     <Tbl3 date="2011-05-19" /> 
    </Tbl2> 
    </Tbl1> 
</MyRoot> 
クエリを簡素化するには、私はあなたが同じ id値になりましたすべてのしていることから、参加するが、以下は、クエリの右の形状を生成を単純化したと思います
+0

ここでの問題は、各行に対してtbl1が繰り返されることです。質問のように開始時と終了時にtbl1を得る方法はありますか?これまでの作業に感謝します。 –

+1

@FrancisRodgers - より多くのサンプルデータ/より正確な結合を投稿する方が簡単かもしれません - 現在の結合条件では、3つのテーブル全体で 'id'が等しくなる必要がありますが、サンプルXMLでは、 ( 'Tbl2/@ id 'の値が' Tbl1/@ id'と異なるため) –

+0

あまりにも長くかかると残念です。私はerdとサンプルデータを掲示し、問題に対応するためにSQLを修正しました。しかし、理想的ではないすべてのレコードの周りにを複製します。私が得たい出力の例を示すもう一つの編集がなされました。 –

0

この場合、XMLパスを使用する必要があると思います。 このような何かを試してみてください:

select Tbl1.id, 
     'xyz ' as [randCol], 
     (SELECT Tbl2.id, 
       Tbl2.name, 
       (convert(date,aDate,102)) as [date] 
       FROM (dbo.table1 as Tbl1 inner join table3 as Tbl3 on Tbl1.id = Tbl3.id inner join table2 as Tbl2 on Tbl3.id = Tbl2.id where Tbl1.id = 1) 
       FOR XML PATH('Table2'), TYPE 
     ) 
from table1 
FOR XML path('Table1'), root('myroot'), ELEMENTS; 

、それは仕事をdoesntの場合はその簡単にテストするので、あなたは、テーブル構造を投稿することができますか?

+0

あなたの答えをありがとう、ここに問題があるようです。私はそれが私または余分なブレースであるかどうかわからないが、私は実行するコードを取得することはできません。 (Imはキーワードの近くで不正確な構文を取得しています)。 –

関連する問題