2017-02-06 2 views
2

​​でない場合は、categoryidのノードと値を表示したいだけです。私は異なったフォーマットを試みたが、何も働かなかった。 if文を結果として文字列として出力するだけです。私はあなたのコードの一部として他の条件を持っていなければならないことを読んで、私はちょうど空のstringを置くことができますか?私はこれについてのいくつかの記事と運がないmsdn参照を見てきました。何らかの理由で私のifの声明を評価しています。sqlの条件付きのXML

declare @XML xml = N' 
<books> 
    <book> 
     <title>Book 1</title> 
     <categoryid>00000000-0000-0000-0000-000000000000</categoryid> 
     <author>Chris</author> 
     <price>10</price> 
    </book> 
    <book> 
     <title>Book 2</title> 
     <categoryid>DF3D696D-B7A3-44A2-BC7D-1D45745C979B</categoryid> 
     <author>Spencer</author> 
     <price>20</price> 
    </book> 
</books>'; 


select @XML.query(
'<books> 
    { 
     for $b in /books/book 
      return 
      <book> 
       {$b/title} 
       {$b/price} 
       if(not($b/categoryid = 00000000-0000-0000-0000-000000000000)) 
        then {$b/categoryid} 
       else 

      </book> 
    } 
</books>' 
); 

答えて

2

私には2つの問題があると思います。

1 - "if"の前と "else"の後に条件付きブロックを中括弧で囲む必要がありました。

2 - 空のguid値がそれ自身の変数である必要がありました - 私はそれが文字列として扱われていたと思います。

"not"演算子を期待通りに動作させることができないため、その問題を回避するために条件を逆転させました。

declare @XML xml = N' 
<books> 
    <book> 
     <title>Book 1</title> 
     <categoryid>00000000-0000-0000-0000-000000000000</categoryid> 
     <author>Chris</author> 
     <price>10</price> 
    </book> 
    <book> 
     <title>Book 2</title> 
     <categoryid>DF3D696D-B7A3-44A2-BC7D-1D45745C979B</categoryid> 
     <author>Spencer</author> 
     <price>20</price> 
    </book> 
</books>'; 

declare @emptyguid uniqueidentifier = '00000000-0000-0000-0000-000000000000' 

select @XML.query(' 
<books> 
    { 
    for $b in /books/book 
    return 
     <book> 
     {$b/title} 
     {$b/price} 
     { 
      if($b/categoryid = sql:variable("@emptyguid")) then 
      () 
      else (
      $b/categoryid 
     ) 
     } 
     </book> 
    } 
</books> 
');