Encaminhar: já li este tópico do StackOverflow e ele não aborda a retenção de profundidade de que preciso.
Desejo criar um documento XML que contenha os objetos de definição de dados para um único banco de dados, usando a hierarquia:
<CATALOG>
<SCHEMA>
<TABLE>
<TableExtendedProperty/>
<TableExtendedProperty/>
<COLUMN>
<ColumnExtendedProperty/>
<ColumnExtendedProperty/>
</COLUMN>
<COLUMN>
<ColumnExtendedProperty/>
<ColumnExtendedProperty/>
</COLUMN>
...etc...
</TABLE>
...etc...
</SCHEMA>
...etc...
</CATALOG>
Eu tenho duas consultas construídas.
- Um cria a hierarquia para o nível TABLE com elementos filhos TableExtendedProperty
- Um cria a hierarquia para o nível COLUMN com elementos filhos ColumnExtendedProperty
O resultado XML (abreviado) para cada consulta é fornecido abaixo.
Preciso (a) mesclar essas duas variáveis XML em uma única variável XML ou (b) construir uma consulta diferente que produza o resultado desejado.
O que você pode recomendar?
Código fonte
Query creating hierarchy to the TABLE level with child TableExtendedProperty elements
SELECT DISTINCT
_Catalog.TABLE_CATALOG
,_Schema.TABLE_SCHEMA
,_Table.TABLE_NAME
,_TableExtProp.name as TableExtPropName
,_TableExtProp.value as TableExtPropValue
from information_schema.tables _Schema
INNER JOIN information_schema.columns _Catalog ON _Catalog.TABLE_CATALOG=_Schema.TABLE_CATALOG
INNER JOIN information_schema.tables _Table ON _Table.TABLE_NAME=_Schema.TABLE_NAME
LEFT OUTER join sys.extended_properties _TableExtProp on _TableExtProp.major_id=OBJECT_ID(_Schema.TABLE_SCHEMA + '.' + _Table.TABLE_NAME) and _TableExtProp.minor_id=0
FOR XML AUTO
RESULT
<_Catalog TABLE_CATALOG="A">
<_Schema TABLE_SCHEMA="B">
<_Table TABLE_NAME="C">
<_TableExtProp TableExtPropName="TP1" TableExtPropValue="Lorem" />
<_TableExtProp TableExtPropName="TP2" TableExtPropValue="Ipsum" />
</_Table>
<_Table TABLE_NAME="D">
<_TableExtProp TableExtPropName="TP1" TableExtPropValue="Borem" />
</_Table>
</_Schema>
<_Schema TABLE_SCHEMA="E">
<_Table TABLE_NAME="F">
</_Table>
<_Table TABLE_NAME="G">
<_TableExtProp TableExtPropName="TP1" TableExtPropValue="Corem" />
</_Table>
</_Schema>
</_Catalog>
Query creating hierarchy to the COLUMN level with child ColumnExtendedProperty elements
SELECT DISTINCT
_Catalog.TABLE_CATALOG
,_Schema.TABLE_SCHEMA
,_Table.TABLE_NAME
,_Col.COLUMN_NAME
,_ColumnExtProp.name as ColumnExtPropName
,_ColumnExtProp.value as ColumnExtPropValue
from information_schema.tables _Schema
INNER JOIN information_schema.columns _Catalog ON _Catalog.TABLE_CATALOG=_Schema.TABLE_CATALOG
INNER JOIN information_schema.tables _Table ON _Table.TABLE_NAME=_Schema.TABLE_NAME
INNER JOIN information_schema.columns _Col ON _col.Table_name=_Table.Table_Name /* need a schema comparison also */
LEFT OUTER join sys.extended_properties _ColumnExtProp on _ColumnExtProp.major_id=OBJECT_ID(_Schema.TABLE_SCHEMA + '.' + _Table.TABLE_NAME) and _ColumnExtProp.minor_id=_Col.ORDINAL_POSITION
FOR XML AUTO
RESULT
<_Catalog TABLE_CATALOG="A">
<_Schema TABLE_SCHEMA="B">
<_Table TABLE_NAME="C">
<_Col COLUMN_NAME="AXA">
<_ColumnExtProp ColumnExtPropName="CP1" ColumnExtPropValue="WWW" />
<_ColumnExtProp ColumnExtPropName="CP2" ColumnExtPropValue="WWW" />
</_Col>
<_Col COLUMN_NAME="FRDCQ">
<_ColumnExtProp ColumnExtPropName="CP1" ColumnExtPropValue="EQW" />
</_Col>
</_Table>
<_Table TABLE_NAME="D">
<_Col COLUMN_NAME="PolicyTypeCode">
<_ColumnExtProp ColumnExtPropName="CP3" ColumnExtPropValue="SAS" />
</_Col>
</_Table>
</_Schema>
<_Schema TABLE_SCHEMA="E">
<_Table TABLE_NAME="F">
<_Col COLUMN_NAME="BAXA">
</_Col>
<_Col COLUMN_NAME="BAFA">
<_ColumnExtProp ColumnExtPropName="CP1" ColumnExtPropValue="WEW" />
</_Col>
</_Table>
<_Table TABLE_NAME="G">
<_Col COLUMN_NAME="BAFA">
<_ColumnExtProp ColumnExtPropName="CP1" ColumnExtPropValue="WTTEW" />
</_Col>
</_Table>
</_Schema>
</_Catalog>
DESIRED RESULT
<_Catalog TABLE_CATALOG="A">
<_Schema TABLE_SCHEMA="B">
<_Table TABLE_NAME="C">
<_TableExtProp TableExtPropName="TP1" TableExtPropValue="Lorem" />
<_TableExtProp TableExtPropName="TP2" TableExtPropValue="Ipsum" />
<_Col COLUMN_NAME="AXA">
<_ColumnExtProp ColumnExtPropName="CP1" ColumnExtPropValue="WWW" />
<_ColumnExtProp ColumnExtPropName="CP2" ColumnExtPropValue="WWW" />
</_Col>
<_Col COLUMN_NAME="FRDCQ">
<_ColumnExtProp ColumnExtPropName="CP1" ColumnExtPropValue="EQW" />
</_Col>
</_Table>
<_Table TABLE_NAME="D">
<_TableExtProp TableExtPropName="TP1" TableExtPropValue="Borem" />
<_Col COLUMN_NAME="PolicyTypeCode">
<_ColumnExtProp ColumnExtPropName="CP3" ColumnExtPropValue="SAS" />
</_Col>
</_Table>
</_Schema>
<_Schema TABLE_SCHEMA="E">
<_Table TABLE_NAME="F">
<_Col COLUMN_NAME="BAXA">
</_Col>
<_Col COLUMN_NAME="BAFA">
<_ColumnExtProp ColumnExtPropName="CP1" ColumnExtPropValue="WEW" />
</_Col>
</_Table>
<_Table TABLE_NAME="G">
<_TableExtProp TableExtPropName="TP1" TableExtPropValue="Corem" />
<_Col COLUMN_NAME="BAFA">
<_ColumnExtProp ColumnExtPropName="CP1" ColumnExtPropValue="WTTEW" />
</_Col>
</_Table>
</_Schema>
</_Catalog>
Você pode usar
for xml path
em vez defor xml raw
. Crie sua hierarquia em subconsultas correlacionadas na lista de campos. Você também pode usarorder by
nas subconsultas para ter as tabelas ordenadas alfabeticamente e as colunas ordenadas porORDINAL_POSITION
.Eu tentei traduzir o que você tem e cheguei a isso.
Com esta tabela em um banco de dados
DBName
.A saída é.