2017-11-22 18 views
1

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> 

を持っている私はそれがすべてについてXSD形式だか、私はいくつかのXMLタスク・アクションを実行する必要があるとします。現在、SSISのXMLソース(データフロータスク)では、xsdを生成しようとしていますが、データのある「f」テーブルがあり、フィールドのマークと列挙はありません。結果は

xml

current "f" table output

私はすべての11個の列を含む一つのテーブルを持っているしたいと思います。

+0

写真を投稿しないでください!あなたの質問を編集して、(減らされたが有効な)XMLをコピーアンドペースト可能*テキストとして提供してください。このXMLはどこから来たのですか? – Shnugo

+0

@ Shnugo申し訳ありませんが、画像の修正済み – golazo

答えて

0

これが役立つかどうかわかりませんが、次の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を使用して結果を区切ります

関連する問題