2012-02-13 159 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最後)