2011-02-23 7 views
8

表はMasterTableのSqlのXqueryは、更新クエリのテキストを置換する方法

IDタイプBIGINT

NameタイプVARCHAR(200)(いくつかの理由で店舗xml型のデータを)

として命名されましたNameには、

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

私はVarchar条件付きで、その後xmlに更新/特定のタグすなわちいずれかen-US/it-ITvalue一部を置き換えるキャストする必要があり、その時点で、その後Master表をUpdateする必要があります。

データなし/タグので、私はそれが<en-US></en-US><it-IT></it-IT>のようなテーブルでInsert空のタグ要素なので、updateクエリはを処理する必要がありますデータを挿入する時に考えるName列であることのチャンスがありますタグ要素の空の値、つまりen-US/it-ITです。

私は次の更新クエリのようにしようとしています。クエリのXMLデータ型のメソッドの

不正使用を実行しているとき、私は次のエラーを取得

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 

「を変更」。この文脈では、非ミューテータ法が期待されている。

答えて

14

xml.modifyから割り当てることはできません。変更は、変数/列に対して直接作用します。また、キャストで修正を使用することはできません。

xml変数に名前を抽出し、xmlを変更してからテーブルに戻すことができます。一度に複数の行上で動作するようにこれを必要とする場合は名前のデータ型ではなく@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とテーブル変数を使用することができます。

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 
+0

私はこの '@str VARCHAR(200)を宣言= 'Test''は' @str varchar型を宣言するために(200) セット@str =' Test''を変更していたし、それはどうもありがとう –

+0

..働きました前のコードが 'COALESCE(@Name、Name)'だった場合のやり方を教えてください。今度は 'UPDATE MasterTable 'をName = Name.modify(' en-US/text ( "@ Str")で) ここで、ID = 18のように @StrのNULLを扱います。 –

+0

また、 'Name'カラムが' VARCHAR(200) 'であるため、だから私は直接それに 'modify'を呼び出すという問題に直面しています –

関連する問題