2009-06-02 3 views
1

데이터베이스에서 직접 값을 가져 와서 XML 문자열을 작성한 다음 xml을 파일에 쓰는 방법이 있습니다. 나는 " '", "<"특수 문자 예 얻을 때까지SQL 서버에서 xml 열 값을 xml로 인코딩하십시오.

이 괜찮습니다, "&"등 사람이 내가 그들을 선택으로 나를 값을 인코딩 할 수 있도록 할 SQL 서버에 뭔가를 알고 있나요

; 예를 들면; 감사합니다

myTable에

에서

선택 인코딩 (service_status).

+0

당신은 당신의 SQL Server 버전 ... –

+0

아우를 추가 할 수 있습니다! 정말로 슬픈! 하지만 C#에서 작은 기능을 적어서 SQL Server에 추가 할 수는 없습니까? – Kirtan

+0

나는 그것에 대해 갈 우수한 기사에 대한 참고 자료를 추가했다. – Kirtan

답변

3

> = sql 2005를 사용하는 경우 xml 요소에 값을 채우고 다시 가져 오는 것이 가장 쉽다고 생각합니다. 이렇게하면 인코딩이 필요한 모든 항목이 강조됩니다.

그냥 SQL에서 할 중 하나를 CLR이 필요하지 않습니다
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 Server 버전 2005/2008을 사용하는 경우, 그럼 CLR Functions을 사용하여 자신의 ENCODE 함수를 만들 수 있으므로 운이 좋습니다.

A really good article can be found here.

+0

.net :(나는 자바 기반의 BPM 스위트를 사용하고있다. (:(그렇지 않으면 완벽 할 것이다. – Gais

1

호출 응용 프로그램이 사용자가 XML로 반환하는 내용을 작성하는 경우 데이터를 인코딩하는 것은 호출 응용 프로그램의 책임입니다. SQL Server에서 XML을 반환하려는 경우 귀하에게 달려 있으며 Quassnoi의 "FOR XML"대답은 정확합니다.

2

...

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

관련 문제