2012-02-13 250 views
2

我有.MAP文件,它是从SAS XML映射器创建的。顾名思义,该文件是从XML文件派生的。现在我想从这个文件中插入数据到SQL Server 2008表中。 .MAP文件包含近28个表的数据。有没有办法导入这么庞大的数据?在SQL Server 2008中导入XML数据

这是.MAP文件的示例。该文件太大,无法共享,所以我只是添加文件的一部分来提供一些基本的想法,但不能共享实际的文件。

<?xml version="1.0" encoding="UTF-8"?> 
<!-- ############################################################ --> 
<!-- 2012-02-10T13:13:14 --> 
<!-- SAS XML Libname Engine Map --> 
<!-- Generated by XML Mapper, 902000.3.6.20090116170000_v920 --> 
<!-- ############################################################ --> 
<!-- ### Validation report         ### --> 
<!-- ############################################################ --> 
<!-- XMLMap validation completed successfully. --> 
<!-- ############################################################ --> 
<SXLEMAP name="AUTO_GEN" version="1.2"> 

<!-- ############################################################ --> 
<TABLE name="Patients"> 
    <TABLE-DESCRIPTION>Patients</TABLE-DESCRIPTION> 
    <TABLE-PATH syntax="XPath">/Patients</TABLE-PATH> 

    <COLUMN name="Patients_ORDINAL" ordinal="YES"> 
     <INCREMENT-PATH beginend="BEGIN" syntax="XPath">/Patients</INCREMENT-PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

</TABLE> 

<TABLE name="Patient"> 
    <TABLE-DESCRIPTION>Patient</TABLE-DESCRIPTION> 
    <TABLE-PATH syntax="XPath">/Patients/Patient</TABLE-PATH> 

    <COLUMN name="Patients_ORDINAL" ordinal="YES"> 
     <INCREMENT-PATH beginend="BEGIN" syntax="XPath">/Patients</INCREMENT-PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

    <COLUMN name="Patient_ORDINAL" ordinal="YES"> 
     <INCREMENT-PATH beginend="BEGIN" syntax="XPath">/Patients/Patient</INCREMENT-PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

    <COLUMN name="PatientID"> 
     <PATH syntax="XPath">/Patients/Patient/PatientID</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

</TABLE> 
</SXLEMAP> 
+0

您肯定可以将这些数据从XML导入到SQL Server中的临时表中 - 这种或那种方式。从那里开始,你可以验证,充实,“分发”那些数据......这个XML导入语句可能有点混乱和巨大 - 但我确信你可以使这个工作。问题是:那个.map文件是怎么样的?大量的数据/行或者XML中的许多层次级别? – 2012-02-13 06:26:21

+0

@marc_s。我用.MAP文件的一部分编辑了我的问题。它可能有很多数据/行和。在某些地方,它将有2-3层次的层次,正如我所说,它包含的数据,如果以某种方式插入,则会影响28个表格。 – 2012-02-13 06:37:34

回答

3

鉴于你的输入样本,你可以用这样的“分解”是XML到关系数据(行和列):

DECLARE @input XML = '<?xml version="1.0" encoding="UTF-8"?> 
<SXLEMAP name="AUTO_GEN" version="1.2"> 
<TABLE name="Patients"> 
    <TABLE-DESCRIPTION>Patients</TABLE-DESCRIPTION> 
    <TABLE-PATH syntax="XPath">/Patients</TABLE-PATH> 

    <COLUMN name="Patients_ORDINAL" ordinal="YES"> 
     <INCREMENT-PATH beginend="BEGIN" syntax="XPath">/Patients</INCREMENT-PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

</TABLE> 

<TABLE name="Patient"> 
    <TABLE-DESCRIPTION>Patient</TABLE-DESCRIPTION> 
    <TABLE-PATH syntax="XPath">/Patients/Patient</TABLE-PATH> 

    <COLUMN name="Patients_ORDINAL" ordinal="YES"> 
     <INCREMENT-PATH beginend="BEGIN" syntax="XPath">/Patients</INCREMENT-PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

    <COLUMN name="Patient_ORDINAL" ordinal="YES"> 
     <INCREMENT-PATH beginend="BEGIN" syntax="XPath">/Patients/Patient</INCREMENT-PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

    <COLUMN name="PatientID"> 
     <PATH syntax="XPath">/Patients/Patient/PatientID</PATH> 
     <TYPE>numeric</TYPE> 
     <DATATYPE>integer</DATATYPE> 
    </COLUMN> 

</TABLE> 
</SXLEMAP>' 


SELECT 
    TableName = Map.Tbl.value('@name', 'varchar(50)'), 
    TableDescription = Map.Tbl.value('(TABLE-DESCRIPTION)[1]', 'varchar(50)'), 
    TablePath = Map.Tbl.value('(TABLE-PATH)[1]', 'varchar(50)'), 
    ColumnName = Map2.Col.value('@name', 'varchar(50)'), 
    ColumnPath = Map2.Col.value('(PATH)[1]', 'varchar(50)'), 
    ColumnIncrementPath = Map2.Col.value('(INCREMENT-PATH)[1]', 'varchar(50)'), 
    ColumnType = Map2.Col.value('(TYPE)[1]', 'varchar(50)'), 
    ColumnDataType = Map2.Col.value('(DATATYPE)[1]', 'varchar(50)') 
FROM 
    @input.nodes('/SXLEMAP/TABLE') AS Map(Tbl) 
CROSS APPLY 
    Map.Tbl.nodes('COLUMN') AS Map2(Col) 

这会给你喜欢的输出的东西:

TableName TableDescription TablePath   ColumnName  ColumnPath   ColumnIncrementPath ColumnType ColumnDataType 
Patients Patients   /Patients   Patients_ORDINAL NULL   /Patients numeric integer 
Patient Patient   /Patients/Patient Patients_ORDINAL NULL   /Patients numeric integer 
Patient Patient   /Patients/Patient Patient_ORDINAL NULL   /Patients/Patient numeric integer 
Patient Patient   /Patients/Patient PatientID   /Patients/Patient/PatientID NULL numeric integer 

扩展该方法,您应该能够完全解析XML并将其放入一个中间关系格式,然后您可以使用该关系格式从中继续(并将数据放在其位置b最后)