Существует ли способ получить xml-безопасную версию xml столбца в SQL-сервере?
Xml-сейфом я означаю выходить из специальных символов как <>', и, и т.д.
Я хотел бы постараться не делать замены сам. Есть ли сборка в функции в SQL-сервере.
То, чего я хочу достигнуть, должно сохранить содержание XML в другой атрибут XML.
Я предполагаю, что под xml-safe вы подразумеваете экранирование специальных тегов XML. Если у вас есть столбец XML, который вы хотите включить в другой документ XML, то у вас есть два варианта:
[*]
: select ..., xmlcolumn as [*], ... from ... for xml path...
это встроит XML-содержимое колонки в результат XMl. Например, если столбец имеет значение value
, то результат будет выглядеть как value |
. select ..., xmlcolumn, ... from ... for xml path...
это вставит содержимое столбца в качестве значения (т.е. выделит его). Например, то же значение, что и выше, даст <element><value</element> |
. Если ваш вопрос касается чего-то другого, то вам придется перефразировать его соответствующим образом и правильно использовать термины. Не придумывайте новые термины, которые никто, кроме вас, не понимает.
Update:
Если вы вставляете значения XML в колонку, то вам вообще ничего не нужно делать. Клиентские библиотеки знают, как правильно экранировать. При условии, что вы правильно напишете свой код. Помните, что XML - это НЕ строка и никогда, никогда не должен рассматриваться как строка. Если вы пишете XML в своем клиенте, используйте соответствующую библиотеку XML (XmlWriter, XML DOM, Linq to XML и т.д.). При передаче XML в SQL Server используйте соответствующий тип: SqlXml. Хранимые процедуры должны использовать соответствующий тип параметров: XML. При чтении используйте соответствующий метод для чтения XML: GetSqlXml(). То же самое относится к объявлению типа в одном из конструкторов мириад (LINQ to SQL , EF и т.д.). В конечном счете, никогда не нужно экранировать символы XML вручную. Если вы обнаружили, что делаете это, значит, вы используете неправильный API, и вам придется вернуться к чертежной доске.
Хорошим началом для чтения является Поддержка XML в Microsoft SQL Server 2005.
И наконец, чтобы манипулировать XML так, как вы описываете (обновить XML столбец таблицы A с XML столбцом таблицы B), вы используете XML методы, в частности modify (... insert...), и вы связываете столбец таблицы B внутри XQuery с помощью sql:column
:
update A
set somecolumn.modify('insert {sql:column("B.othercolumn")} before somenode')
from A join B on ...;
В своем комментарии вы угрожаете XML как строке, и, как я уже сказал, вы никогда не должны этого делать: строки и XML - это как вода и масло.
Содержимое столбца XML - это XML. По определению, это "безопасно для XML".
Нужно ли вам включать XML из столбца в элемент или атрибут XML другого документа XML? Затем просто сохраните внешний XML как строку в новом документе.