MS SQL para la pregunta de ruta xml con respecto al elemento xpath
-
08-07-2019 - |
Pregunta
Tengo la siguiente instrucción TSQL:
select
tblName "TblName",
structure "TblName/STRUCTURE",
sqlRetrieve "TblName/SQLRETRIEVE",
Identifier "TblName/IDENTIFIER",
'2' "TblName/OBJECTTYPE"
from
configTable
for xml path ('')
que genera:
<TblName>PD_CODE_PRODUCTS
<STRUCTURE>PD_CODE_PRODUCTS</STRUCTURE>
<SQLRETRIEVE>BATCHSP</SQLRETRIEVE>
<IDENTIFIER>DATA_OWNER</IDENTIFIER>
<OBJECTTYPE>2</OBJECTTYPE>
</TblName>
<TblName>PD_two
<STRUCTURE>PD_CODE_PRODUCTS</STRUCTURE>
<SQLRETRIEVE>BATCHSP</SQLRETRIEVE>
<IDENTIFIER>DATA_OWNER</IDENTIFIER>
<OBJECTTYPE>2</OBJECTTYPE>
</TblName>
pero quiero tener esta salida (el nombre del elemento:
<PD_CODE_PRODUCTS>
<STRUCTURE>PD_CODE_PRODUCTS</STRUCTURE>
<SQLRETRIEVE>BATCHSP</SQLRETRIEVE>
<IDENTIFIER>DATA_OWNER</IDENTIFIER>
<OBJECTTYPE>2</OBJECTTYPE>
</PD_CODE_PRODUCTS>
<PD_two>
<STRUCTURE>PD_CODE_PRODUCTS</STRUCTURE>
<SQLRETRIEVE>BATCHSP</SQLRETRIEVE>
<IDENTIFIER>DATA_OWNER</IDENTIFIER>
<OBJECTTYPE>2</OBJECTTYPE>
</PD_two>
¿Alguien sabe cómo lograr esto con T-SQL?
Gracias
Daniel
Solución
No creo que pueda lograr esto con T-SQL, desafortunadamente.
Lo más cercano que puede llegar es esto:
<TABLE Name="PD_CODE_PRODUCTS">
<TblName>
<STRUCTURE>PD_CODE_PRODUCTS</STRUCTURE>
<SQLRETRIEVE>BATCHSP</SQLRETRIEVE>
<IDENTIFIER>DATA_OWNER</IDENTIFIER>
<OBJECTTYPE>2</OBJECTTYPE>
</TblName>
</TABLE>
<TABLE Name="PD two">
<TblName>
<STRUCTURE>PD_CODE_PRODUCTS</STRUCTURE>
<SQLRETRIEVE>BATCHSP</SQLRETRIEVE>
<IDENTIFIER>DATA_OWNER</IDENTIFIER>
<OBJECTTYPE>2</OBJECTTYPE>
</TblName>
</TABLE>
si adapta su consulta para que sea:
select
tblName '@Name',
structure "TblName/STRUCTURE",
sqlRetrieve "TblName/SQLRETRIEVE",
Identifier "TblName/IDENTIFIER",
'2' "TblName/OBJECTTYPE"
from
configTable
for xml path ('TABLE')
Lo siento, no puedo ser de más ayuda aquí, ¡supongo que es una característica que Microsoft realmente no ha considerado (hasta ahora)! :-)
Marc
Otros consejos
Si tiene algún control sobre la estructura XML, le ruego que no haga lo que está tratando de hacer. Me he encontrado con documentos XML donde los nombres de los elementos XML cambian según los datos y es horrible trabajar con ellos. Las declaraciones XPath son difíciles, XSLT es casi imposible.
Haz lo que sugiere marc_s, te lo agradecerás más tarde.
Si no tienes control sobre la estructura, entonces tienes mis condolencias.
Si te entendí correctamente, quieres un elemento raíz en lugar de tener muchas raíces principales.
Uso:
select tblName '@Name', structure "TblName/STRUCTURE", sqlRetrieve "TblName/SQLRETRIEVE", Identifier "TblName/IDENTIFIER", '2' "TblName/OBJECTTYPE"from configTable for xml path (''), root('TABLE'), type