0

仲間の SO ユーザーのおかげで、私は FOR XML を進歩させていますが、SQL 構文を正しく理解できていないことは明らかです。

次のSQLがあるとしましょう

DECLARE @Uname VARCHAR(15) = 'Dom',
        @Pword VARCHAR(15) = 'Monty'

SELECT 
   RTRIM(@Uname) AS '@uname',
   RTRIM( @Pword) AS '@pword',
   (SELECT COALESCE(PortOfLanding,'') AS portOfLanding 
    FROM Landings.LandingHeaders  
    WHERE Posted = 0 
    FOR XML PATH('Sale')) 
FOR XML PATH('abc')

実行すると、出力として次のものが生成されます

<abc uname="Dom" pword="Monty">&lt;Sale&gt;&lt;portOfLanding&gt;GBHTG&lt;/portOfLanding&gt;&lt;/Sale&gt;&lt;Sale&gt;&lt;portOfLanding&gt;GBHTG&lt;/portOfLanding&gt;&lt;/Sale&gt;</abc>

私が本当に望んでいたのは次のことでした

<abc uname="Dom" pword="Python">
    <Sale portOfLanding= "GBHTG" />
    <Sale portOfLanding= "GBHTG"/>
</abc>

実際、SQLに3番目のセクションを追加して、最終的にxmlで終わるようにしたいと思います

<abc uname="Dom" pword="Python">
    <Sale portOfLanding= "GBHTG">
        <saleline detail="some value here" />
        <saleline detail="some value here" />
    <Sale/>
    <Salesnote portOfLanding= "GBHTG"/>
</abc>

元の SQL クエリのどこが間違っているか指摘してもらえますか?

ありがとう

4

1 に答える 1

1

これを試して:

DECLARE @Uname VARCHAR(15) = 'Dom',
        @Pword VARCHAR(15) = 'Monty';

SELECT RTRIM(@Uname) AS '@uname',
       RTRIM( @Pword) AS '@pword', 
      (SELECT COALESCE(PortOfLanding,'') AS '@portOfLanding' 
       FROM Landings.LandingHeaders  
       WHERE Posted = 0 
       FOR XML PATH('Sale'), TYPE)
FOR XML PATH('abc')

次のようにさらに深くすることができます:

SELECT RTRIM(@Uname) AS '@uname',
       RTRIM( @Pword) AS '@pword', 
      (SELECT COALESCE(PortOfLanding,'') AS '@portOfLanding',
             (SELECT COALESCE(PortOfLanding,'') AS '@detail'
              FROM Landings.LandingHeaders  
              FOR XML PATH('SaleLine'), TYPE)
       FROM Landings.LandingHeaders  
       WHERE Posted = 0 
       FOR XML PATH('Sale'), TYPE)
FOR XML PATH('abc')
于 2015-05-15T16:23:52.003 に答える