转发:我已经阅读了这个 StackOverflow 线程,它没有解决我需要的深度保留。
我想使用层次结构创建一个包含单个数据库的数据定义对象的 XML 文档:
<CATALOG>
<SCHEMA>
<TABLE>
<TableExtendedProperty/>
<TableExtendedProperty/>
<COLUMN>
<ColumnExtendedProperty/>
<ColumnExtendedProperty/>
</COLUMN>
<COLUMN>
<ColumnExtendedProperty/>
<ColumnExtendedProperty/>
</COLUMN>
...etc...
</TABLE>
...etc...
</SCHEMA>
...etc...
</CATALOG>
我构建了两个查询。
- 使用子 TableExtendedProperty 元素创建到 TABLE 级别的层次结构
- 使用子 ColumnExtendedProperty 元素创建到 COLUMN 级别的层次结构
下面提供了每个查询的(缩写)XML 结果。
我需要 (a) 将这两个 XML 变量合并到一个 XML 变量中,或者 (b) 构造一个不同的查询来产生所需的结果。
你能推荐什么?
源代码
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>
您可以使用
for xml path
而不是for xml raw
. 在字段列表中的相关子查询中构建您的层次结构。您还可以order by
在子查询中使用按字母顺序排列的表和按顺序排列的列ORDINAL_POSITION
。我试图翻译你所拥有的并想出了这个。
有了这个表在数据库中
DBName
。输出是。