2011-02-23 23 views
8

表被命名爲MasterTable的Sql XQuery的在更新查詢替換文本

IDBIGINT

NameVARCHAR(200)(存儲xml類型的數據由於某種原因)

Name包含數據結構爲

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

當我需要UpdateMaster表,然後在那個時候我需要轉換Varcharxml然後有條件更新/更換特定標籤的value部分即要麼en-US/it-IT

還有一些機會,無數據/標籤是否有Name列,所以我想在插入數據的時候它會像<en-US></en-US><it-IT></it-IT>Insert空標籤元素,所以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數據類型的方法時收到以下錯誤「修改」。預計在這種情況下非增變方法。

回答

14

您不能從xml.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 
+0

我改變了這個'聲明@str爲varchar(200)= 'Test''到'聲明@str爲varchar(200) 集@str =' Test''和它的工作..感謝了很多 –

+0

如果前面的代碼是'COALESCE(@Name,Name)',現在我想將其更改爲'UPDATE MasterTable set name = Name.modify('replace value of(en-US/text) ())[1]與sql:variable(「@ Str」)') 其中ID = 18'同樣 即在@Str中處理NULL –

+0

也作爲'Name'列是'VARCHAR(200)所以我面臨直接調用'modify'的問題 –