2015-12-21 54 views
0

什么是进口/这种XML的转换成SQL数据库的正确,最有效的方法:XML到SQL - 行有列没有唯一的标识符

<?xml version="1.0" encoding="UTF-8"?> 
<data app-version-major="xyz" app-version-minor="xyz" app-version-build="xyz" schema-version="xyz" export-time="xyz" db-product-name="Apache Derby" db-product-version="xyz"> 
<table name="table1" entire="Y"> 
    <columns> 
     <column name="col1" class="java.lang.Long" type-id="-5" db-type="bigint"/> 
     <column name="col2" class="java.lang.String" length="10" type-id="12" db-type="varchar"/> 
     <column name="col3" class="java.lang.String" length="255" type-id="12" db-type="varchar"/> 
     <column name="col4" class="java.lang.Double" type-id="8" db-type="double"/> 
     <column name="col5" class="java.lang.String" length="1" type-id="1" db-type="char"/> 
     <column name="col6" class="java.lang.Double" type-id="8" db-type="double"/> 
     <column name="col7" class="java.lang.String" length="50" type-id="12" db-type="varchar"/> 
     <column name="col8" class="java.lang.String" length="1" type-id="1" db-type="char"/> 
     <column name="col9" class="java.lang.String" length="2000" type-id="12" db-type="varchar"/> 
     <column name="col11" class="java.lang.String" length="1" type-id="1" db-type="char"/> 
     <column name="col12" class="java.sql.Timestamp" type-id="93" db-type="timestamp"/> 
     <column name="col13" class="java.sql.Timestamp" type-id="93" db-type="timestamp"/> 
     <column name="col14" class="java.lang.String" length="50" type-id="12" db-type="varchar"/> 
     <column name="col15" class="java.sql.Timestamp" type-id="93" db-type="timestamp"/> 
     <column name="col16" class="java.lang.String" length="50" type-id="12" db-type="varchar"/> 
     <column name="col17" class="java.lang.Long" type-id="-5" db-type="bigint"/> 
     <column name="col18" class="java.lang.String" length="255" type-id="12" db-type="varchar"/> 
     <column name="col19" class="java.lang.String" length="255" type-id="12" db-type="varchar"/> 
     <column name="col20" class="java.lang.String" length="255" type-id="12" db-type="varchar"/> 
     <column name="col21" class="java.lang.String" length="1" type-id="1" db-type="char"/> 
     <column name="col22" class="java.sql.Timestamp" type-id="93" db-type="timestamp"/> 
     <column name="col23" class="java.lang.String" length="20" type-id="12" db-type="varchar"/> 
     <column name="col24" class="java.lang.String" length="20" type-id="12" db-type="varchar"/> 
     <column name="col25" class="java.lang.String" length="50" type-id="12" db-type="varchar"/> 
     <column name="col26" class="java.lang.Long" type-id="-5" db-type="bigint"/> 
    </columns> 
    <row> 
     <v>value1</v> 
     <v>value2</v> 
     <v>value3</v> 
     <v>value4</v> 
     <v>value5</v> 
     <v>value6</v> 
     <v>value7</v> 
     <v>value8</v> 
     <v>value9</v> 
     <v>value10</v> 
     <v>value11</v> 
     <v>value12</v> 
     <v>value13</v> 
     <v>value14</v> 
     <v>value15</v> 
     <v>value16</v> 
     <v>value17</v> 
     <v>value18</v> 
     <v>value19</v> 
     <v>value20</v> 
     <v>value21</v> 
     <v>value22</v> 
     <v>value23</v> 
     <v>value24</v> 
     <v>value25</v> 
    </row> 
    <row> 
     <v>value1</v> 
     <v>value2</v> 
     <v>value3</v> 
     <v>value4</v> 
     <v>value5</v> 
     <v>value6</v> 
     <v>value7</v> 
     <v>value8</v> 
     <v>value9</v> 
     <v>value10</v> 
     <v>value11</v> 
     <v>value12</v> 
     <v>value13</v> 
     <v>value14</v> 
     <v>value15</v> 
     <v>value16</v> 
     <v>value17</v> 
     <v>value18</v> 
     <v>value19</v> 
     <v>value20</v> 
     <v>value21</v> 
     <v>value22</v> 
     <v>value23</v> 
     <v>value24</v> 
     <v>value25</v> 
    </row> 
</table> 

目前实验已在SQL Express ,试图找到一种方法来获取<row>标签中的信息以更正列(row1-> col1-> value1等)。

我试过了下面这个指南:https://www.mssqltips.com/sqlservertip/2899/importing-and-processing-data-from-xml-files-into-sql-server-tables/ - 但我被卡在行内选择了“匿名”列数据 - 我得到的只是空值。

我也试着运行几个XML到CSV转换器没有运气。这将是怎样的呢?

+0

结构是否总是相同或必须处理不同的XML数据? – Shnugo

回答

0

如果你的XML是总是​​在结构上同我愿意做这样的:

在我的例子我认为,该XML被读入一个XML变量了。如果您需要帮助如何将XML从文件读取到SQL中,请询问...

只需将其粘贴到空的查询窗口中并执行即可。适应您的需求...

DECLARE @XML XML= 
'<data app-version-major="xyz" app-version-minor="xyz" app-version-build="xyz" schema-version="xyz" export-time="xyz" db-product-name="Apache Derby" db-product-version="xyz"> 
    <table name="table1" entire="Y"> 
    <columns> 
     <column name="col1" class="java.lang.Long" type-id="-5" db-type="bigint" /> 
     <column name="col2" class="java.lang.String" length="10" type-id="12" db-type="varchar" /> 
     <column name="col3" class="java.lang.String" length="255" type-id="12" db-type="varchar" /> 
     <column name="col4" class="java.lang.Double" type-id="8" db-type="double" /> 
     <column name="col5" class="java.lang.String" length="1" type-id="1" db-type="char" /> 
     <column name="col6" class="java.lang.Double" type-id="8" db-type="double" /> 
     <column name="col7" class="java.lang.String" length="50" type-id="12" db-type="varchar" /> 
     <column name="col8" class="java.lang.String" length="1" type-id="1" db-type="char" /> 
     <column name="col9" class="java.lang.String" length="2000" type-id="12" db-type="varchar" /> 
     <column name="col11" class="java.lang.String" length="1" type-id="1" db-type="char" /> 
     <column name="col12" class="java.sql.Timestamp" type-id="93" db-type="timestamp" /> 
     <column name="col13" class="java.sql.Timestamp" type-id="93" db-type="timestamp" /> 
     <column name="col14" class="java.lang.String" length="50" type-id="12" db-type="varchar" /> 
     <column name="col15" class="java.sql.Timestamp" type-id="93" db-type="timestamp" /> 
     <column name="col16" class="java.lang.String" length="50" type-id="12" db-type="varchar" /> 
     <column name="col17" class="java.lang.Long" type-id="-5" db-type="bigint" /> 
     <column name="col18" class="java.lang.String" length="255" type-id="12" db-type="varchar" /> 
     <column name="col19" class="java.lang.String" length="255" type-id="12" db-type="varchar" /> 
     <column name="col20" class="java.lang.String" length="255" type-id="12" db-type="varchar" /> 
     <column name="col21" class="java.lang.String" length="1" type-id="1" db-type="char" /> 
     <column name="col22" class="java.sql.Timestamp" type-id="93" db-type="timestamp" /> 
     <column name="col23" class="java.lang.String" length="20" type-id="12" db-type="varchar" /> 
     <column name="col24" class="java.lang.String" length="20" type-id="12" db-type="varchar" /> 
     <column name="col25" class="java.lang.String" length="50" type-id="12" db-type="varchar" /> 
     <column name="col26" class="java.lang.Long" type-id="-5" db-type="bigint" /> 
    </columns> 
    <row> 
     <v>value1</v> 
     <v>value2</v> 
     <v>value3</v> 
     <v>value4</v> 
     <v>value5</v> 
     <v>value6</v> 
     <v>value7</v> 
     <v>value8</v> 
     <v>value9</v> 
     <v>value10</v> 
     <v>value11</v> 
     <v>value12</v> 
     <v>value13</v> 
     <v>value14</v> 
     <v>value15</v> 
     <v>value16</v> 
     <v>value17</v> 
     <v>value18</v> 
     <v>value19</v> 
     <v>value20</v> 
     <v>value21</v> 
     <v>value22</v> 
     <v>value23</v> 
     <v>value24</v> 
     <v>value25</v> 
    </row> 
    <row> 
     <v>value1</v> 
     <v>value2</v> 
     <v>value3</v> 
     <v>value4</v> 
     <v>value5</v> 
     <v>value6</v> 
     <v>value7</v> 
     <v>value8</v> 
     <v>value9</v> 
     <v>value10</v> 
     <v>value11</v> 
     <v>value12</v> 
     <v>value13</v> 
     <v>value14</v> 
     <v>value15</v> 
     <v>value16</v> 
     <v>value17</v> 
     <v>value18</v> 
     <v>value19</v> 
     <v>value20</v> 
     <v>value21</v> 
     <v>value22</v> 
     <v>value23</v> 
     <v>value24</v> 
     <v>value25</v> 
    </row> 
    </table> 
</data>'; 

SELECT @XML.value('/data[1]/@app-version-major','varchar(max)') AS AppVersionMajor 
     ,@XML.value('/data[1]/@app-version-minor','varchar(max)') AS AppVersionMinor 
     --further attribs of node "data" 
     ,@XML.value('(/data/table)[1]/@name','varchar(max)') AS TableName 
     ,@XML.value('(/data/table)[1]/@entire','varchar(max)') AS TableEntire 

     ,One.Row.value('v[1]','varchar(max)') AS col1 --use the fitting name and type of your "table" node here 
     ,One.Row.value('v[2]','varchar(max)') AS col2 
     ,One.Row.value('v[3]','varchar(max)') AS col3 
     --further columns here 

FROM @XML.nodes('/data/table/row') AS One(Row)  
0

你的xml的好处是你可以有5,10或100的值。相同的过程可以适用。

使用XML解析器(Java或其他语言),并反复

的每一行,与SQL注入。

即使对于数千个数据,它也是相当有效的。