3

データベースに Page テーブルがあります。簡単にするために、2 つの列があるとしましょう。title と xmlData 「私の例」のようなタイトルがあり、次のような xml フィールドがあります。

<MA>
  <A>
    <URL>my-example-</URL>
    <id>5</id>
    </A>
</MA>
  1. 最後に「-」があるURLの検索置換を行い、最後の末尾の「-」が存在する場合はそれのみを削除しようとしています

  2. 末尾のスペースを削除します(スペースがある場合はタイトルに)

次のようにして、変更する必要がある行を取得できます

select * from Pages
where title like '% '

(一部つなぎ目などありますが、基本的には以上です)

4

2 に答える 2

1

これにより、各行の 1 つの URL が置き換えられます。サンプル XML を見ると、行ごとに 1 つの URL しかありません。

with C1 as
(
  select xmlData,
         xmlData.value('(/MA/A/URL/text())[1]', 'nvarchar(500)') as URL
  from Pages
),
C2 as
(
  select xmlData,
         URL,
         left(URL, len(URL) - 1) as URL2
  from C1
  where right(URL, 1) = '-'
)
update C2 
set xmlData.modify('replace value of (/MA/A/URL/text())[1] 
                    with sql:column("C2.URL2")')

CTE C1 の URL 値を抽出します。
URL から最後の「-」を削除し、CTE C2 の URL2 に入れます。更新する必要のない行も削除します。modify() メソッド (xml データ型)
を使用して XML を更新します。

代わりに、クエリの XML 部分でジョブを実行する別のバージョンを次に示します。

update Pages
set xmlData.modify('replace value of (/MA/A/URL/text())[1] 
                    with fn:substring((/MA/A/URL/text())[1], 1, fn:string-length((/MA/A/URL/text())[1])-1)')
where xmlData.exist('/MA/A/URL[fn:substring(text()[1], fn:string-length(text()[1]), 1) = "-"]') = 1

一度に 1 つのノードしか更新できないため、1 つの行に複数の URL がある場合は、上記のコードをループに入れて、更新するものがある限り更新を行う必要があります。を使用@@ROWCOUNTして、更新によって何かが更新されたかどうかを確認し、まで更新をやり直すことができます@@ROWCOUNT = 0

于 2013-07-13T17:48:23.247 に答える
0

CHARINDEX 関数を使用して、文字「-」が存在するかどうかを確認できます。また、SUBSTIRNG 関数を使用して、テキストを置き換える部分のみを取得できます。

例:

declare @a varchar(100)
set @a = 'HI, TODAY IS A - BEAUTIFUL DAY'

select 
    case
        when charindex('-',@a) >= 0 then
        substring(@a, 0, charindex('-',@a)-1) + 
        substring(@a, charindex('-', @a) + 1, 100)
        else @a
    end
于 2013-07-13T12:30:09.180 に答える