Как получить xml-безопасную версию SQL-столбца SQL-сервера - PullRequest
7 голосов
/ 27 июля 2010

Есть ли способ получить xml-безопасную версию столбца xml на сервере sql?

Под xml-Safe я имею в виду экранирование специальных символов, таких как <,>, ', & и т. Д.

Я бы хотел избежать замены самостоятельно. Есть ли встроенная функция на сервере sql.

Чего я хочу добиться - это сохранить содержимое XML в другом атрибуте XML.

Ответы [ 4 ]

13 голосов
/ 13 июня 2013

Это не прямой ответ на этот вопрос, но для любого, кто пытается xml-escape-строки в TSQL, вот небольшая функция, которую я написал:

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
8 голосов
/ 27 июля 2010

Я предполагаю, что под xml-safe вы подразумеваете экранирование специальных тегов XML.Если у вас есть столбец XML, который вы хотите включить в другой документ XML, тогда у вас есть два варианта:

  • проецировать столбец как [*]: select ..., xmlcolumn as [*], ... from ... for xml path..., в результате содержимое XML столбца будет встроено врезультат XMl.Например.если столбец имеет значение <element>value</element>, то результат будет похож на <root><row><element>value</element></row></root>.
  • проецирует столбец как имя столбца: select ..., xmlcolumn, ... from ... for xml path... это вставит содержимое столбца как значение (т. Е. Оно будет экранировано).Например.то же значение, что и выше, даст <root><row><xmlcolumn>&lt;element&gt;&lt;value&lt;/element&gt;.

Если ваш вопрос касается чего-то другого, вам придется правильно перефразировать его и правильно использовать термины.Не придумывайте новые термины, которые никто не понимает, кроме вас.

Обновление :

Если вы вставляете значения 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 (...вставить ...) , и вы связываете столбец таблицы B внутри XQuery, используя sql:column:

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

В своем комментарии вы угрожаете XML как строкой икак я уже говорил, вам никогда не следует этого делать: строки и XML - это как вода и масло.

5 голосов
/ 27 октября 2016

Другой более простой способ экранирования XML-строки - использовать следующее:

SELECT @String FOR XML PATH('')

например,

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

, а затем использовать @string оттуда

2 голосов
/ 27 июля 2010

Содержимое столбца XML является XML.По определению это «XML-безопасный».

Нужно ли включать XML из столбца в элемент XML или атрибут другого документа XML?Затем просто сохраните внешний XML как строку в новом документе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...