2009-06-02 8 views
1

J'ai une méthode qui prend des vales directement à partir de la base de données, en construisant une chaîne de xml et en écrivant ensuite le xml dans un fichier.Encoder les valeurs des colonnes xml en tant que xml dans le serveur SQL

Ceci est bien jusqu'à ce que je reçois des caractères spéciaux, par exemple « ' », « < », « & », etc.

Quelqu'un sait-il quelque chose dans Sql Server qui me permettrait de coder les valeurs que je les sélectionne ; par exemple;

select encode (service_status) de myTable

Merci.

+0

pouvez-vous ajouter votre version serveur sql ... –

+0

Owww! Très triste! Mais ne pouvez-vous pas écrire une petite fonction en C# pour faire la même chose et l'ajouter sur SQL Server? – Kirtan

+0

J'ai ajouté une référence à un excellent article montrant à faire à ce sujet. – Kirtan

Répondre

3

Si vous avez> = sql 2005, je pense qu'il peut être plus facile de placer votre valeur dans un élément xml, puis de le retirer. Cela autorisera tout ce qui nécessite un encodage.

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

Utiliser la clause FOR XML.

Il peut construire XML à partir de plusieurs valeurs automatiquement:

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

Si vous voulez juste encoder une valeur existante, utilisez:

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

--- 
Barnes &amp; Noble 
+0

à partir de SQL 2005, n'est-ce pas? –

+0

"FOR XML" existe aussi dans SQL 2000. http://msdn.microsoft.com/en-us/magazine/cc163782.aspx – gbn

+0

@Mitch: Je pensais que c'était en 2005+ seulement, mais le lien de @ gbn a changé d'avis. – Quassnoi

0

Si vous utilisez la version SQL Server 2005/2008, alors vous avez de la chance, car vous pouvez créer votre propre fonction ENCODE en utilisant CLR Functions.

A really good article can be found here.

+0

Je n'utilise pas .net :(J'utilise une suite BPM basée sur JAVA :(:(Sinon ce serait parfait – Gais

1

Si l'application appelante construit ce que vous renvoyez en XML, l'application appelante doit encoder les données. Si vous voulez renvoyer XML à partir de SQL Server, cela dépend de vous, et la réponse «FOR XML» de Quassnoi est correcte.

2

vous n'avez pas besoin du CLR soit juste le faire dans 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

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

Questions connexes