2009-06-02 5 views
1

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

Это нормально, пока я не специальные символы, например, «'», „<“, „&“ и т.д.

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

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

Спасибо.

+0

Вы можете добавить свой сервер версии SQL ... –

+0

Owww! Действительно печально! Но не можете ли вы записать небольшую функцию на C#, чтобы сделать то же самое и добавить ее на SQL Server? – Kirtan

+0

Я добавил ссылку на отличную статью, показывающую, как это сделать. – Kirtan

ответ

3

Если у вас есть> = 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; 
5

Использовать 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 
+0

это SQL 2005 и далее, правильно? –

+0

«FOR XML» существует и в SQL 2000. http://msdn.microsoft.com/en-us/magazine/cc163782.aspx – gbn

+0

@Mitch: Я думал, что это было только в 2005+, но связь @ gbn изменилась. – Quassnoi

0

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

A really good article can be found here.

+0

Я не использую .net :(Я использую набор BPM на основе JAVA :(:(Иначе это было бы идеально – Gais

1

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

2

вам не нужно 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 
0

Мой вариант:

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('&<&>"&&')

Смежные вопросы