2010-07-27 25 views
5

Có cách nào để nhận phiên bản xml an toàn của cột xml trong máy chủ sql không?Cách lấy phiên bản xml an toàn của cột XML máy chủ sql

By xml-Safe i có nghĩa là thoát ký tự đặc biệt như <,>, ', & vv

tôi muốn tránh làm thay thế bản thân mình. Có một xây dựng trong chức năng trong máy chủ sql.

Điều tôi muốn đạt được là lưu trữ nội dung xml vào một thuộc tính xml khác.

+3

"xml-an toàn" ?? Ý bạn là như thế nào?? Xin giải thích - không phải là một biểu thức thường được sử dụng trong quan điểm của tôi .... –

+0

Bạn có ý gì bằng cách "tránh làm thay thế bản thân mình"? "Thay thế" bạn nói về cái gì? – NotMe

+0

Tôi cá là anh ta nghĩ anh ta cần dịch '<' sang '<', ví dụ. –

Trả lời

8

Tôi giả định rằng bằng xml-safe, bạn có nghĩa là thoát khỏi các thẻ đặc biệt XML. Nếu bạn có một cột XML bạn muốn bao gồm trong một tài liệu XML sau đó bạn có hai lựa chọn:

  • dự án cột như [*]: select ..., xmlcolumn as [*], ... from ... for xml path... này sẽ nhúng nội dung XML của cột trong XML kết quả. Ví dụ. nếu cột có giá trị <element>value</element> thì kết quả sẽ giống như <root><row><element>value</element></row></root>.
  • dự án cột làm tên cột: select ..., xmlcolumn, ... from ... for xml path... điều này sẽ chèn nội dung của cột dưới dạng giá trị (nghĩa là nó sẽ thoát khỏi cột). Ví dụ. cùng giá trị như trên sẽ tạo ra <root><row><xmlcolumn>&lt;element&gt;&lt;value&lt;/element&gt;.

Nếu câu hỏi của bạn là về thứ gì đó khác, thì bạn sẽ phải diễn đạt lại một cách thích hợp và sử dụng cụm từ đúng cách. Đừng phát minh ra những thuật ngữ mới mà không ai hiểu nhưng bạn.

Cập nhật:

Nếu bạn đang chèn giá trị XML vào cột, sau đó bạn không cần phải làm bất cứ điều gì cả. Các thư viện khách hàng biết cách xử lý việc thoát thích hợp. Miễn là bạn viết mã của mình chính xác. Lưu ý, XML là NOT một chuỗi và không bao giờ nên được coi là một. Nếu bạn viết XML trong ứng dụng khách, hãy sử dụng thư viện XML thích hợp (XmlWriter, XML DOM, Linq to XML v.v.). khi chuyển trong XML vào SQL Server, hãy sử dụng kiểu thích hợp: SqlXml. Các thủ tục được lưu trữ nên sử dụng kiểu tham số appropiate: XML. Khi bạn đọc nó, hãy sử dụng phương pháp thích hợp để đọc XML: GetSqlXml(). Cũng giống như việc khai báo kiểu trong một trong các nhà thiết kế miriad (LINQ to SQL, EF, v.v.). Cuối cùng, có không bao giờ bất kỳ nhu cầu nào để thoát khỏi các ký tự XML theo cách thủ công. Nếu bạn thấy mình làm điều đó, bạn đang sử dụng sai API và bạn phải quay lại bảng vẽ.

Bắt đầu đọc tốt là XML Support in Microsoft SQL Server 2005.

Và cuối cùng, để thao tác XML như bạn mô tả (cột XML cập nhật của bảng A với cột XML của bảng B), bạn sử dụng XML methods, cụ thể modify (... insert...), và bạn ràng buộc cột bảng B bên trong XQuery sử dụng sql:column:

update A 
set somecolumn.modify('insert {sql:column("B.othercolumn")} before somenode') 
from A join B on ...; 

Trong bạn nhận xét bạn đe dọa XML dưới dạng chuỗi và, như tôi đã nói, bạn sẽ không bao giờ làm điều đó: chuỗi và XML là nước và dầu.

2

Nội dung của cột XML là XML. Theo định nghĩa, đó là "XML an toàn".

Bạn có cần bao gồm XML từ một cột trong phần tử XML hoặc thuộc tính của tài liệu XML khác không? Sau đó, chỉ cần lưu XML bên ngoài dưới dạng một chuỗi trong tài liệu mới.

+1

Tôi cần lấy XML và chèn vào một thuộc tính XML. Tôi có bảng A có chứa một cột XML và Bảng B cũng có chứa một cột XML, tôi cần lấy XML từ bảng B và lưu trữ nó theo một nội dung xml của Bảng A. Tôi đã cố gắng thực hiện một "" nhưng điều này sẽ không hoạt động vì tableBxmlContent chứa <, > vv ... – pdiddy

10

Nó không phải là một câu trả lời trực tiếp cho câu hỏi này, nhưng cho bất cứ ai cố gắng chuỗi xml-thoát trong TSQL, đây là một chức năng nhỏ, tôi đã viết:

CREATE FUNCTION escapeXml 
(@xml nvarchar(4000)) 
RETURNS nvarchar(4000) 
AS 
BEGIN 
    declare @return nvarchar(4000) 
    select @return = 
    REPLACE(
     REPLACE(
      REPLACE(
       REPLACE(
        REPLACE(@xml,'&', '&amp;') 
       ,'<', '&lt;') 
      ,'>', '&gt;') 
     ,'"', '&quot;') 
    ,'''', '&#39;') 

return @return 
end 
GO 
+0

Chính xác những gì tôi đang tìm kiếm, cảm ơn! –

4

Một cách khác đơn giản hơn để xml thoát khỏi một chuỗi là để sử dụng các mục sau:

SELECT @String FOR XML PATH('') 

ví dụ:

DECLARE @Input NVARCHAR(4000) = 'bacon & eggs' 
DECLARE @String = (SELECT @Input FOR XML PATH('')) 

sau đó sử dụng @string từ đó

+0

Cách tốt nhất để chuyển đổi dầu thành nước! – brewmanz

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