2009-09-17 64 views
21

Tôi cần cập nhật trường GroupID thành 0. Tôi đã tìm ra cách truy xuất giá trị, hiện tại tôi đang gặp sự cố khi cập nhật nó.Cập nhật giá trị nút XML trong SQL Server

Bất kỳ trợ giúp nào sẽ tuyệt vời!

<ProblemProfile> 
    <GroupID>-1</GroupID> 
    <LayoutID>1</LayoutID> 
    <MyQueries>false</MyQueries> 
</ProblemProfile> 

Declare @Result xml 
set @Result = convert(xml,(select ProfileXML from profiles where id = 23)) 

SELECT x.value('.', 'int') ID 
FROM @Result.nodes('/ProblemProfile/GroupID') as R(x) 

Cập nhật

Những gì tôi cần làm bây giờ là cập nhật groupId mỗi hàng duy nhất của có giá trị của 'foo'

declare @foo int 
set @foo = -1 

UPDATE profiles 
SET ProfileXML.modify('replace value of (/ProblemProfile/GroupID/text())[1] with "0"') 
WHERE ProfileXML.value('(/ProblemProfile/GroupID)[1]', 'int') = @foo 

này chỉ được cập nhật hàng đầu tiên đáp ứng tiêu chí này. Tôi cập nhật mỗi hàng như thế nào?

Cập nhật 2 Tuyên bố đó hoạt động. Hóa ra cấu trúc cơ sở dữ liệu cho nút đầu tiên có thể khác nhau. Một //GroupID ...etc đơn giản được cập nhật mỗi hàng. Nó luôn luôn là những điều nhỏ bé ngu ngốc mà đi chúng tôi lên haha.

Trả lời

32

Bạn có thể làm một cái gì đó như thế này:

UPDATE 
    dbo.profiles 
SET 
    ProfileXML.modify('replace value of (/ProblemProfile/GroupID/text())[1] with "0"') 
WHERE 
    id = 23 

Kiểm tra bài viết này trên SQL Server 2005 XQuery and XML-DML để biết thêm chi tiết về những gì bạn có thể làm với .modify từ khóa (chèn, xóa, thay thế vv).

Marc

PS: Để có được giá trị, nó sẽ dễ dàng hơn rất nhiều để làm điều này:

SELECT ProfileXML.value('(/ProblemProfile/GroupID)[1]', 'int') as ID 
FROM dbo.profiles 
WHERE id = 23 

(tất nhiên trừ khi bạn cần XML như là một biến SQL cho một cái gì đó khác sau)

+0

Thực tế việc sử dụng các nút() và các giá trị() là một thực hành tốt. Trong trường hợp này không tạo ra bất kỳ sự khác biệt nào, nhưng nếu nhiều cột được truy vấn thì tốt hơn khi sử dụng các nút(): "Sự kết hợp của các phương thức node() và value() có thể hiệu quả hơn trong việc tạo ra các rowset khi nó có một vài cột "http://technet.microsoft.com/en-us/library/ms187508(SQL.90).aspx –

+0

@Remus: vâng, điểm tốt - nếu bạn cần nhiều giá trị, sử dụng các nút() có ý nghĩa tổng thể, tôi đồng ý . –

+1

Tuyệt vời. chỉ là những gì tôi cần. –

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