2017-11-22 2 views
1

xml 파일을 플랫 테이블로 가져 오려고합니다. 소스 파일은 내가 모든 XSD 형식에 관하여 가정 또는 나는 일부 XML 작업의 작업을 수행 할 필요가 약간 특이한 형식을XML을 SQL Server 테이블로 가져 오기

<?xml version="1.0" encoding="utf-8"?> 
    <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> 

있습니다. 현재 SSIS XML 소스 (데이터 흐름 작업)에서 xsd를 생성하려고 시도하는 동안 필드가 표시되고 열거되지 않고 데이터가있는 "f"테이블을 제공합니다. 결과에서

current "f" table output

xml

나는 모든 열한 열을 포함하는 하나 개의 테이블을 가지고 싶습니다.

+0

사진을 게시하지 마십시오! 질문을 편집하고 (축소되었지만 유효한) XML을 * copy-n-pasteable * 텍스트로 제공하십시오. 이 XML은 어디서 오는가? – Shnugo

+0

@Shnugo 죄송합니다 사진을 수정했습니다. – golazo

답변

0

이 방법이 도움이 될지 모르지만 다음 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를 사용하여 결과를 구분하십시오.

관련 문제