Кодировать значения столбца xml как xml на сервере sql - PullRequest
1 голос
/ 02 июня 2009

У меня есть метод, который берет вейлы непосредственно из базы данных, строит строку xml и затем записывает xml в файл.

Это нормально, пока я не получу специальные символы, например "'", "<", "&" и т. Д. </p>

Кто-нибудь знает что-то в Sql Server, что позволило бы мне кодировать значения при их выборе; например;

выберите кодировать (service_status) из myTable

Спасибо.

Ответы [ 6 ]

5 голосов
/ 02 июня 2009

Использовать FOR XML предложение.

Может автоматически строить XML из нескольких значений:

WITH  q AS (
        SELECT  'Barnes & Noble' AS shop
        UNION ALL
        SELECT  'Marks & Spencer'
        )
SELECT  *
FROM    q
FOR XML AUTO, TYPE

---
<q shop="Barnes &amp; Noble" /><q shop="Marx &amp; Spencer" />

Если вы просто хотите закодировать существующее значение, используйте:

SELECT  'Barnes & Noble'
FOR XML PATH('')

---
Barnes &amp; Noble
3 голосов
/ 02 июня 2009

Если у вас> = sql 2005, я думаю, что будет проще всего вставить ваше значение в элемент XML и затем извлечь его обратно. Это даст право на все, что требует кодирования.

declare @x xml, @str varchar(8000), @encStr varchar(8000)
set @x = '<a/>'
set @str = '><&'

set @x.modify(
    'insert text{sql:variable("@str")}
    as first into (/a)[1]')

set @encStr = CAST(@x.query('/a/text()') as varchar(8000))
select @encStr
--returns: &gt;&lt;&amp;
2 голосов
/ 01 ноября 2010

вам также не нужен CLR, просто сделайте это в sql ...

create function [dbo].[fn_XMLEscape]( @s varchar(max)) returns varchar(max)
as 
begin
  declare @rs varchar(max) 
  set @rs = @s
  set @rs = replace(@rs, '&', '&amp;')
  set @rs = replace(@rs, '''', '&apos;')
  set @rs = replace(@rs, '"', '&quot;')
  set @rs = replace(@rs, '>', '&gt;')
  set @rs = replace(@rs, '<', '&lt;')
  Return( @rs)
end
1 голос
/ 02 июня 2009

Если вызывающее приложение строит то, что вы возвращаете в XML, то вызывающее приложение должно кодировать данные. Если вы хотите вернуть XML из SQL Server, то это будет ваше дело, и ответ Quassnoi «FOR XML» верен.

0 голосов
/ 05 сентября 2014

Мой вариант:

CREATE FUNCTION dbo.fn_XmlEncode (@STR varchar(200))
RETURNS varchar(200)
AS
BEGIN
    IF CHARINDEX('&', @STR) > 0
    BEGIN
       DECLARE @POS1 int, @POS2 int
       SET @POS1 = CHARINDEX('&', @STR)
       WHILE @POS1 > 0 BEGIN
           IF SUBSTRING(@STR, @POS1, 5) <> '&'
              SET @STR = LEFT(@STR, @POS1 - 1) + '&' 
                  + case when @POS1 < LEN(@STR) THEN SUBSTRING(@STR, @POS1 + 1, LEN(@STR) - @POS1) ELSE '' END
           SET @POS2 = CHARINDEX('&', SUBSTRING(@STR, @POS1 + 5, LEN(@STR)))
           IF @POS2 = 0 BREAK
           SET @POS1 = @POS1 + 4 + @POS2
       END
    END
    WHILE CHARINDEX('<', @STR) > 0
       SET @STR = REPLACE(@STR, '<', '<')
    WHILE CHARINDEX('>', @STR) > 0
       SET @STR = REPLACE(@STR, '>', '>')
    RETURN @STR
END
GO
-- Tests
SELECT dbo.fn_XmlEncode('&&'), dbo.fn_XmlEncode('&<&>"&&')
0 голосов
/ 02 июня 2009

Если вы используете SQL Server версии 2005/2008, то вам повезло, так как вы можете создать свою собственную функцию ENCODE, используя Функции CLR .

Здесь можно найти действительно хорошую статью .

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