2011-02-23 37 views
8

Bảng được đặt tên như MasterTableSql XQuery Làm thế nào để Thay thế văn bản trong Update Query

Cột

ID loại BIGINT,

Name loại VARCHAR(200) (cửa hàng xml kiểu dữ liệu đối với một số lý do)

Name chứa dữ liệu có cấu trúc như

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

Khi tôi cần phải Update các Master Bảng sau đó tại thời điểm đó tôi cần phải cast Varchar-xml sau đó có điều kiện cập nhật/thay thế các value phần của thẻ đặc biệt tức là một trong hai en-US/it-IT.

Cũng có những cơ hội mà Không có dữ liệu/thẻ đang có trong Name cột vì vậy tôi nghĩ rằng tại thời điểm Chèn dữ liệu mà nó sẽ Insert yếu tố thẻ trống trong bảng như <en-US></en-US><it-IT></it-IT>, vì vậy update truy vấn phải xử lý giá trị rỗng trong các yếu tố thẻ cụ thể là en-US/it-IT.

Tôi đang cố gắng thực hiện như truy vấn cập nhật sau.

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 

tôi nhận được lỗi sau khi chạy truy vấn

sử dụng bất hợp pháp của phương pháp kiểu dữ liệu xml 'sửa đổi'. Một phương pháp không biến đổi được mong đợi trong ngữ cảnh này.

Trả lời

14

Bạn không thể chỉ định từ xml.modify. Sửa đổi hoạt động trên biến/cột trực tiếp. Bạn cũng không thể sử dụng sửa đổi trên dàn diễn viên.

Bạn có thể trích xuất tên thành biến xml, sửa đổi xml và sau đó đặt nó trở lại bảng.

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 

Nếu bạn cần điều này để làm việc trong hơn một hàng tại một thời điểm, bạn có thể sử dụng một biến bảng với các cột idname nơi kiểu dữ liệu cho tên là xml thay vì biến @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

tôi đã thay đổi này 'tuyên bố varchar @str (200) = 'Test'' cho' tuyên bố @str varchar (200) bộ @str =' Test'' và nó làm việc .. Thanks a lot –

+0

Bạn có thể nói rằng làm thế nào nếu mã trước đó là 'COALESCE (@Name, Name)' và bây giờ tôi muốn thay đổi nó thành 'UPDATE MasterTable set Name = Name.modify ('thay thế giá trị của (en-US/text)()) [1] với sql: biến ("@ Str") ') trong đó ID = 18' như khôn ngoan tức là xử lý NULL trong @Str –

+0

Cũng như cột 'Tên' là' VARCHAR (200) ' vì vậy tôi đang đối mặt với vấn đề trực tiếp gọi 'sửa đổi 'trên nó –

Các vấn đề liên quan