transact stuff query from for sql xml sql-server-2005

stuff - transact sql for xml path



Cómo conservar un ampersand(&) al usar FOR XML PATH en SQL 2005 (3)

Hay situaciones en las que una persona puede no querer un XML bien formado; el que yo (y quizás el póster original) encontré utilizaba la técnica For XML Path para devolver una sola lista de campos de elementos ''secundarios'' mediante una consulta recursiva. Más información sobre esta técnica está aquí (específicamente en la sección ''Los métodos XML de blackbox''): Concatenar valores de fila en Transact-SQL

Para mi situación, ver ''H & E'' (una mancha de patología) transformada en ''XML bien formado'' fue una verdadera decepción. Afortunadamente, encontré una solución ... la siguiente página me ayudó a resolver este problema con relativa facilidad y sin tener que volver a diseñar mi consulta recursiva o agregar un análisis adicional en el nivel de presentación (para esto y para otras situaciones futuras en las que mi hijo -Los campos de datos contienen caracteres XML reservados): Manejo de caracteres especiales con FOR XML PATH

EDIT: código debajo de la publicación de blog referenciada.

select stuff( (select '', <'' + name + ''>'' from sys.databases where database_id > 4 order by name for xml path(''''), root(''MyString''), type ).value(''/MyString[1]'',''varchar(max)'') , 1, 2, '''') as namelist;

¿Hay algún truco para evitar que SQL Server habilite caracteres como &, <y>? Estoy tratando de generar una URL en mi archivo XML, pero SQL quiere reemplazar cualquier ''&'' con '' &amp; ''

Tome la siguiente consulta:

SELECT ''http://foosite.com/'' + RTRIM(li.imageStore) + ''/ImageStore.dll?id='' + RTRIM(li.imageID) + ''&raw=1&rev='' + RTRIM(li.imageVersion) AS imageUrl FROM ListingImages li FOR XML PATH (''image''), ROOT (''images''), TYPE

La salida que recibo es así (& s están entitados):

<images> <image> <imageUrl>http://foosite.com/pics4/ImageStore.dll?id=7E92BA08829F6847&amp;raw=1&amp;rev=0</imageUrl> </image> </images>

Lo que me gustaría es que esto (y no esté autorizado):

<images> <image> <imageUrl>http://foosite.com/pics4/ImageStore.dll?id=7E92BA08829F6847&raw=1&rev=0</imageUrl> </image> </images>

¿Cómo se puede evitar que SQL Server habilite ''&'' s into '' &amp; ¿?


Lo que SQL Server genera es correcto. Lo que espera ver no es un XML bien formado. La razón es que & character significa el inicio de una referencia de entidad, como &amp; . Consulte la especificación XML para obtener más información.

Cuando su analizador XML analiza esta cadena de XML, comprenderá el &amp; la entidad hace referencia y devuelve el texto en la forma que desea, por lo que el formato interno en el archivo XML no debería causarle ningún problema, a menos que esté utilizando un analizador XML con errores o intente analizarlo manualmente (en cuyo caso su actual el código del analizador es actualmente defectuoso en este momento con respecto a la especificación XML).


Prueba esto....

select stuff( (select '', <'' + name + ''>'' from sys.databases where database_id > 4 order by name for xml path(''''), root(''MyString''), type ).value(''/MyString[1]'',''varchar(max)'') , 1, 2, '''') as namelist;