2009-06-02 9 views
1

Ich habe eine Methode, die vales direkt aus der Datenbank nimmt, eine Zeichenfolge von XML erstellen und dann das XML in eine Datei schreiben.Codieren xml Spaltenwerte als XML in SQL-Server

Das ist in Ordnung, bis ich Sonderzeichen wie zB „'“ erhalten, ‚<‘, ‚&‘ usw.

jemand etwas in SQL Server-Weiß, die mich um die Werte zu codieren, erlauben würde, wie ich sie wählen ; beispielsweise;

wählen kodieren (service_status) von myTable

Dank.

+0

können Sie Ihren SQL Server-Version hinzufügen ... –

+0

Owww! Sehr traurig! Aber können Sie nicht eine kleine Funktion in C# aufschreiben, um dasselbe zu tun und sie auf SQL Server hinzuzufügen? – Kirtan

+0

Ich habe einen Verweis auf einen ausgezeichneten Artikel hinzugefügt, der zeigt, wie man darüber vorgeht. – Kirtan

Antwort

3

Wenn Sie> = sql 2005 haben, denke ich, dass es am einfachsten ist, Ihren Wert in ein XML-Element zu stopfen und dann wieder herauszuziehen. Dies berechtigt zu allem, was codiert werden muss.

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

Verwenden Sie FOR XML Klausel.

Es kann XML aus mehreren Werten bauen automatisch:

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" /> 

Wenn Sie nur einen vorhandenen Wert, verwenden Sie kodieren möchten:

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

--- 
Barnes &amp; Noble 
+0

das ist SQL 2005 ab, oder? –

+0

"FOR XML" existiert auch in SQL 2000. http://msdn.microsoft.com/en-us/magazine/cc163782.aspx – gbn

+0

@Mitch: Ich dachte, es war nur in 2005 +, aber @ gbns Link änderte meine Meinung. – Quassnoi

0

Wenn Sie SQL Server-Version 2005/2008 verwenden, Dann haben Sie Glück, denn Sie können Ihre eigene ENCODE Funktion mit CLR Functions erstellen.

A really good article can be found here.

+0

Ich benutze nicht .net :(Ich verwende eine BPM-Suite basierend auf JAVA :(:(Ansonsten wäre das perfekt – Gais

1

Wenn die aufrufende Anwendung das erstellt, was Sie in XML zurückgeben, muss die aufrufende Anwendung die Daten codieren. Wenn Sie XML von SQL Server zurückgeben möchten, dann liegt es an Ihnen, und die "FOR XML" -Antwort von Quassnoi ist korrekt.

2

Sie die CLR nicht brauchen entweder tun es nur in 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

Meine Variante:

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

Verwandte Themen