이 방법이 도움이 될지 모르지만 다음 T_SQL
접근 방식을 사용하면 XML을 가져올 수있는 집합으로 전개 할 수 있습니다. 위치가 일치하는 <field>
및 <f>
요소의 암시 적 정렬에만 의존해야합니다.
이 한 테이블의 이름이 고유로이라면 .. 닥터 버크 당신의 XML은
@xml
변수 선언에 거주한다고 가정
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>';
, 테이블의 수와 행의 수와 함께 작동합니다
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을 * copy-n-pasteable * 텍스트로 제공하십시오. 이 XML은 어디서 오는가? – Shnugo
@Shnugo 죄송합니다 사진을 수정했습니다. – golazo