2011-09-06 35 views
7

Có cách nào để kết hợp hai giá trị thay thế này với 1 câu lệnh cập nhật không?TSQL 2005, XML DML - Cập nhật hai giá trị cùng một lúc?

UPDATE dbo.MyTable 
SET MyXmlColumn.modify('replace value of (/node/@att1)[1] with "1"') 
WHERE id = 1 

UPDATE dbo.MyTable 
SET MyXmlColumn.modify('replace value of (/node/@att2)[1] with "2"') 
WHERE id = 1 

http://msdn.microsoft.com/en-US/library/ms190675(v=SQL.90).aspx

+0

Xem câu trả lời cho http://stackoverflow.com/questions/7395942/updating-multiple-xml-nodes-using-t-sql. –

Trả lời

6

Tôi không nghĩ bạn may mắn, Thx.

Tôi đã thử một số biến thể cú pháp không có niềm vui. Ví dụ, rõ ràng:

SET MyXmlColumn.modify('...'), MyXmlColumn.modify('...') 

sản lượng:

Tên cột 'MyXmlColumn' được chỉ định nhiều hơn một lần trong mệnh đề SET . Không thể chỉ định một cột nhiều hơn một giá trị trong cùng một mệnh đề ANSET. Sửa đổi mệnh đề SET để đảm bảo rằng một cột là chỉ được cập nhật một lần. Nếu mệnh đề SET cập nhật các cột của một chế độ xem, thì tên cột 'MyXmlColumn' có thể xuất hiện hai lần trong chế độ xem .

Nhưng không có gì hữu ích cho thông báo lỗi này trong không gian XML DML.

Dòng dưới cùng là Expression1 & Expression2 phải là các phần tử đơn lẻ.

Ngay cả các cuộc thảo luận kỹ lưỡng nhất kết thúc vòng lặp qua nó ...

http://blogs.msdn.com/b/denisruc/archive/2005/09/19/471562.aspx

Xin lỗi. :(

PS: Nếu bạn có thể chịu được hackiness, đúc thành VARCHAR (MAX), sau đó làm một bình thường REPLACE() nên làm các trick Xem:. Can I do a find/replace in t-sql?

2

Không, như đã nêu trong tài liệu, replace value of chỉ có thể hoạt động trên một nút duy nhất tại một thời điểm. Theo tôi biết, không có cách giải quyết nào cho việc này. Bạn cần sử dụng 2 câu lệnh cập nhật.

+1

"Lưu ý rằng mục tiêu đang được cập nhật phải, tối đa, một nút được chỉ định rõ ràng trong biểu thức đường dẫn bằng cách thêm" [1] "vào cuối biểu thức." Tôi đã thực hiện điều này có nghĩa là xpath của tôi chỉ có thể trả về 1 nút, không phải liệu tôi có thể có hai giá trị thay thế của câu lệnh mỗi lần nhắm mục tiêu 1 nút hay không – TrevDev

1

Nếu bạn chỉ có một vài giá trị mà bạn muốn để thay đổi bạn có thể sử dụng phương pháp này tôi tìm thấy tại sqlservercentral. Nó sử dụng một câu lệnh chọn để có được dữ liệu thao tác nó nhiều lần và sử dụng một câu lệnh cập nhật duy nhất để thay đổi dữ liệu bảng. Về cơ bản, nó là một phiên bản đơn giản của giải pháp lặp cho một số giá trị cố định cần thay đổi

DECLARE @temp XML 
SET @temp = (SELECT Column_name FROM Table_name WHERE AuthId = @AuthId) 

SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueId/text())[1] with sql:variable("@NewValue")') 
SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueName/text())[1] with sql:variable("@NewValue")') 

UPDATE Table_name 
SET Column_name = @temp 
WHERE AuthId = @AuthId 
Các vấn đề liên quan