transact - stuff sql server for xml path
¿Cómo elegir el nombre de columna devuelto en una consulta SELECT FOR XML? (6)
Eso debería hacer:
select(
SELECT col1
FROM table1
WHERE col2 = ''x''
ORDER by col3
FOR XML path('''')
) as myName
No es bonito, pero debe dar el resultado que necesita
MS SQL tiene una solución conveniente para concatenar un valor de columna de varias filas en un valor:
SELECT col1
FROM table1
WHERE col2 = ''x''
ORDER by col3
FOR XML path('''')
y eso devuelve un buen conjunto de registros:
XML_F52E2B61-18A1-11d1-B105-00805F49916B
----------------------------------------
<col1>Foo</col1><col1>Bar</col1>
¡solo el nombre de la columna en el conjunto de registros devuelto es bastante desagradable!
El nombre de la columna parece incluir elementos aleatorios (o un GUID) y, por lo tanto, soy reacio a usarlo en mi aplicación (diferentes instancias o diferentes servidores pueden tener otro GUID). Desafortunadamente no puedo usar * para seleccionar el valor, y debido a las restricciones en la aplicación existente no puedo repetir las columnas devueltas, ya sea ...
¿Hay alguna manera de forzar el nombre de la columna en el conjunto de registros devuelto a algo más sensato?
procedimiento almacenado
declare @requestResultXML xml
set @requestResultXML =
(
SELECT ''NPOIT-1.0'' AS ''@Interface'',
(
select ''Query'' as ''@Type'',
''GetBill'' as ''@Query'',
''True'' as ''@CompressResult''
FOR XML PATH(''Head''), TYPE
),
(
select @pin as ''@PIN'',
@period as ''@Period'',
@number as ''@Number'',
@barcode as ''@Barcode''
FOR XML PATH(''QueryParams''), TYPE
) as Data
FOR XML PATH(''DataExchangeModule'')
)
select @requestResultXML as GetBillRequest
Prueba esto...
select
(
select ''@greeting'' = ''hello'', ''@where'' = ''there'', ''@who'' = ''world''
for xml path (''salutation''), type
) as ''MyName''
Nota: Si omite el "tipo" después de "para xml", obtiene (creo) una cadena.
Para la generación EXPLICIT xml: con las uniones, debe ajustar los resultados una vez más (como resultado adicional como XML):
SELECT
CAST(
(
SELECT
*
FROM (
SELECT
1 AS Tag
,NULL AS Parent
...
UNION ALL
SELECT ...
FOR XML EXPLICIT
)
) as XML) as [MyName]
DECLARE @XmlData XML;
SET @XmlData = (
SELECT *
FROM [dbo].[TABLE1]
FOR XML PATH(''ChildNodeDetailsResponse'')
,ROOT(''ParentNode'')
)
SELECT @XmlData AS Result
DECLARE @XmlData XML;
SET @XmlData =(SELECT * FROM [dbo].[Users] ORDER by UserName FOR XML path(''''))
SELECT @XmlData AS Result