5

XML列に単純なxmlがあります

<Bands>
    <Band>
        <Name>beatles</Name>
        <Num>4</Num>
        <Score>5</Score>
    </Band>
    <Band>
        <Name>doors</Name>
        <Num>4</Num>
        <Score>3</Score>
    </Band>
</Bands>

列を次のように更新できました:

   -----just update the name to the id)----
   UPDATE tbl1
   SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
   with sql:column("id")')

大丈夫だ。

質問1

このクエリを使用して値を次のように更新するにはどうすればよいですかid+"lalala":

   UPDATE tbl1
   SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
   with sql:column("id") + "lalala"')

エラー = XQuery [tbl1.myXml.modify()]: '+' の引数は、単一の数値プリミティブ型でなければなりません

質問1

[1]最初のレコード ( )をudpate更新したくないとしましょうscore>4

もちろん、 xpath に書くことができます:

replace value of (/Bands/Band[Score>4]/Name/text())[1]

しかし、私はXpathでそれをしたくありません。Where句でこれを行う通常の方法はありませんか?

何かのようなもの :

   UPDATE tbl1
   SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
   with sql:column("id")  where [...score>4...]')

ここにオンラインSQLがあります

4

2 に答える 2

6

文字列を連結したい場合は、 concatを使用idする必要があります。あなたのケースで整数の場合は、concat関数内の文字列にキャストする必要があります。

where 句では、更新するテーブルの行をフィルター処理できますが、XML で更新するノードを指定することはできません。これは xquery 式で行う必要があります。ただし、where 句でexistを使用して、更新が本当に必要な行を除外することができます。

update tbl1
set myXml.modify('replace value of (/Bands/Band[Score > 4]/Name/text())[1] 
                    with concat(string(sql:column("id")), "lalalala")')
where myXml.exist('/Bands/Band[Score > 4]') = 1
于 2012-11-28T07:06:07.147 に答える
5

Q1:

;with t as (select convert(varchar(10),id) + 'lalala' id2, * from #tbl1)
   UPDATE t
   SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
    with sql:column("id2")');

注: これにより、すべてのバンドではなく、最初のバンドの名前のみが更新されることに気付きましたか?

第 2 四半期:

いいえ、あなたがすることはできません。特に(/Bands/Band[Score<4]/Name/text())[1](私がに変更した<)ので、質問のサンプルxmlのドアバンドを具体的にターゲットにしています。一方、WHERE 句は、パスの特定のレベルではなく、XML 全体で機能します。たとえば、非常に間違った解釈:

;with t as (
    select a.*, n.m.value('.','int') Score
    from #tbl1 a
    cross apply myXml.nodes('/Bands/Band/Score') n(m) -- assume singular
)
   UPDATE t
   SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
    with sql:column("id")')
   where Score < 4

スコアが 4 未満の Band が xml に少なくとも 1 つあるため、XML が更新されます。 ただしxml.modify、最初の一致で 1 回しか機能しないため、スコア フィルターに一致する名前ではなく、最初のバンドの名前が更新されます。

于 2012-11-28T00:59:20.153 に答える