これが役立つかどうかわかりませんが、次のT_SQL
アプローチはXMLをインポート可能なセットにフラット化します。位置によってのみ一致するので、<field>
と<f>
要素の暗黙の並べ替えに頼らなければなりません。
この限りテーブルの名前がユニーク
DECLARE @xml XML=
N'<db xmlns:site="http://www.google.com">
<params>
<param name="parser_version" value="2" />
<param name="data_type" value="Events" />
<param name="created" value="2017-11-15T12:21:18" />
<param name="program_version" value="4.5.20.1092" />
</params>
<tables>
<table name="Events">
<fields>
<field name="UniqueID" type="Integer" />
<field name="ID" type="AutoInc" />
<field name="Date" type="Date" />
<field name="Time" type="Time" />
<field name="Code" type="Integer" />
<field name="UserID" type="Integer" />
<field name="UserGUID" type="String" />
<field name="ReaderID" type="Integer" />
<field name="Type" type="Integer" />
<field name="Modified" type="Boolean" />
<field name="ModifReason" type="String" />
</fields>
<rows>
<row>
<f>3086647</f>
<f>18091842</f>
<f>2017-11-14</f>
<f>21:32:10</f>
<f>1</f>
<f>202</f>
<f>{ED53D55D-4B99-41F3-95BD-6945A989155C}</f>
<f>803</f>
<f>32</f>
<f>null</f>
<f>null</f>
</row>
</rows>
</table>
</tables>
</db>';
あるとして、あなたのXMLが宣言された変数@xml
内に住んでいることを前提とし--I、テーブルの任意の数と行の任意の数で動作するはずです
WITH AllTablesAndFields AS
(
SELECT DENSE_RANK() OVER(ORDER BY tbl.value('@name','nvarchar(max)')) AS TableInx
,tbl.value('@name','nvarchar(max)') AS TableName
,ROW_NUMBER() OVER(PARTITION BY tbl.value('@name','nvarchar(max)') ORDER BY (SELECT NULL)) AS FieldInx
,fld.value('@name','nvarchar(max)') AS FieldName
,fld.value('@type','nvarchar(max)') AS FieldType
FROM @xml.nodes('/db/tables/table') AS A(tbl)
OUTER APPLY tbl.nodes('fields/field') AS B(fld)
)
,AllTablesAndRows AS
(
SELECT DENSE_RANK() OVER(ORDER BY tbl.value('@name','nvarchar(max)')) AS TableInx
,tbl.value('@name','nvarchar(max)') AS TableName
,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowInx
,rw.query('.') AS RowNode
FROM @xml.nodes('/db/tables/table') AS A(tbl)
OUTER APPLY tbl.nodes('rows/row') AS B(rw)
)
,AllValues AS
(
SELECT rws.TableInx
,rws.TableName
,rws.RowInx
,ROW_NUMBER() OVER(PARTITION BY rws.RowInx ORDER BY (SELECT NULL)) AS ValueInx
,fld.value('text()[1]','nvarchar(max)') AS Val
FROM AllTablesAndRows AS rws
OUTER APPLY rws.RowNode.nodes('row/f') AS A(fld)
)
SELECT flds.TableName
,flds.FieldName
,flds.FieldType
,vals.Val
FROM AllValues AS vals
FULL OUTER JOIN AllTablesAndFields AS flds ON vals.TableInx=flds.TableInx AND vals.ValueInx=flds.FieldInx;
結果
+-----------+-------------+-----------+----------------------------------------+
| TableName | FieldName | FieldType | Val |
+-----------+-------------+-----------+----------------------------------------+
| Events | UniqueID | Integer | 3086647 |
+-----------+-------------+-----------+----------------------------------------+
| Events | ID | AutoInc | 18091842 |
+-----------+-------------+-----------+----------------------------------------+
| Events | Date | Date | 2017-11-14 |
+-----------+-------------+-----------+----------------------------------------+
| Events | Time | Time | 21:32:10 |
+-----------+-------------+-----------+----------------------------------------+
| Events | Code | Integer | 1 |
+-----------+-------------+-----------+----------------------------------------+
| Events | UserID | Integer | 202 |
+-----------+-------------+-----------+----------------------------------------+
| Events | UserGUID | String | {ED53D55D-4B99-41F3-95BD-6945A989155C} |
+-----------+-------------+-----------+----------------------------------------+
| Events | ReaderID | Integer | 803 |
+-----------+-------------+-----------+----------------------------------------+
| Events | Type | Integer | 32 |
+-----------+-------------+-----------+----------------------------------------+
| Events | Modified | Boolean | null |
+-----------+-------------+-----------+----------------------------------------+
| Events | ModifReason | String | null |
+-----------+-------------+-----------+----------------------------------------+
TableInxを含めます、FieldInx、RowInx、ValueInxを使用して結果を区切ります
写真を投稿しないでください!あなたの質問を編集して、(減らされたが有効な)XMLをコピーアンドペースト可能*テキストとして提供してください。このXMLはどこから来たのですか? – Shnugo
@ Shnugo申し訳ありませんが、画像の修正済み – golazo