2012-02-16 12 views
11

tengo una tabla llamada Map_Data y los datos se parece a:caracteres adicionales durante el uso de XML PATH

ID SoCol                Descol 
125 case Per_rating when 5 then 'Good' when 4 then 'Ok' else null end D_Code 

Y escribí una consulta en esta fila particular y la consulta es:

SELECT Params = (SELECT DesCol + ' = ''' + SoCol + '''' 
        FROM  dbo.Map_Data t1 
        WHERE ID = 125 
        FOR 
        XML PATH('') 
       ) 

y me da la salida como:

D_Code = 'case per_rating
 when 5 then 'Good'
 when 4
 then 'Ok'
 end' 

puede alguien decirme por qué estoy recibiendo '
' y cómo puedo corregirlo?

+1

Comprueba el contenido de Mapdata, me parece que hay # 13 (devoluciones de carro) en él. Es posible que no sean visibles en lo que sea que esté usando para mostrar el contenido de la tabla. Dado dónde están, parece SoCol estaba embellecido. –

Respuesta

15

Este ligero cambio hará que las entidades feos desaparecen, pero no eliminará los retornos de carro (miran los resultados de Resultados de texto, no Resultados a cuadrícula, para verlas):

SELECT Params = (SELECT DesCol + ' = ''' + SoCol + '''' 
        FROM  dbo.Map_Data t1 
        WHERE ID = 125 
        FOR 
        XML PATH(''), TYPE 
       ).value('.[1]', 'nvarchar(max)'); 

Si desea deshacerse de la CR/LF también se puede decir:

SELECT Params = (SELECT REPLACE(REPLACE(DesCol + ' = ''' + SoCol + '''', 
    CHAR(13), ''), CHAR(10), '') 
        FROM  dbo.Map_Data t1 
        WHERE ID = 125 
        FOR 
        XML PATH(''), TYPE 
       ).value('.[1]', 'nvarchar(max)'); 

Además no estoy seguro de cómo se va a utilizar la salida, pero si usted va a evaluarlo posteriormente con dinámico SQL va a necesitar reemplazar las comillas simples incrustadas (') con dos comillas simples (''). De lo contrario, explotará porque también son delimitadores de cadenas.

+0

¡Muchas gracias! – peter

+0

Tenga en cuenta que usar '.value' es mucho más lento que usar sin. Tenía un UDF lleno de llamadas y causó bastante golpe de rendimiento. – Sebazzz

+0

@Sebazz Genial. ¿Puedes mostrar cómo obtener el mismo resultado sin usar '.value'? –

0

También puede lograr esto simplemente manteniendo todo el código en la comilla simple en una línea. Yo también tuve un problema similar y se resuelve manteniendo todo el código en una línea.

Cuestiones relacionadas