10

テーブルの名前はMasterTable

IDタイプBIGINT

Nametype VARCHAR(200)xml何らかの理由で型データを格納します)

Name次のように構造化されたデータが含まれています

<en-US>SomeEnglishText</en-US><it-IT>SomeItalicText</it-IT>

テーブルに移動する必要がUpdateある場合Masterは、その時点でをキャストしVarcharて、特定のタグの一部、つまりいずれかをxml条件付きで更新/置換する必要があります。valueen-US / it-IT

また、列にデータ/タグがない可能性があるNameため、データを挿入するときにInsert、のようにテーブルのタグ要素が空になると思います<en-US></en-US><it-IT></it-IT>。したがって、updateクエリはタグ要素の空の値、つまりを処理する必要があります。en-US/it-IT

私は次の更新クエリのようにそれをやろうとしています。

DECLARE @Str VARCHAR(200)

SET @Str = 'Test Text'

UPDATE [MasterTable]
SET [Name] = cast([MasterTable].[Name] as xml).modify('replace value of (en-US/text())[1] with sql:variable("@Str")')
WHERE [ID]=18

クエリの実行時に次のエラーが発生します

xmlデータ型メソッド「modify」の不正使用。このコンテキストでは、ミューテイタ以外のメソッドが必要です。

4

1 に答える 1

20

xml.modifyから割り当てることはできません。変更は変数/列で直接機能します。キャストでmodifyを使用することもできません。

名前をxml変数に抽出し、xmlを変更してから、テーブルに戻すことができます。

declare @str varchar(200) = 'Test'
declare @xml xml

select @xml = cast(Name as xml)
from MasterTable
where ID = 18

set @xml.modify('replace value of (en-US/text())[1] with sql:variable("@Str")')

update MasterTable
set Name = cast(@xml as varchar(200))
where ID = 18

一度に複数の行を処理するためにこれが必要な場合は、列を持つテーブル変数を使用できますidnameここで、名前のデータ型xmlは変数の代わりになり@xmlます。

declare @str varchar(200) = 'Test Text'
declare @T table (ID int, Name xml)

insert into @T
select ID, cast(Name as xml)
from MasterTable
where Name is not null

update @T
set Name.modify('replace value of (en-US/text())[1] with sql:variable("@Str")')

update MasterTable
set Name = cast(T.Name as varchar(200))
from @T as T
where MasterTable.ID = T.ID
于 2011-02-23T09:20:02.167 に答える