2012-02-13 2 views
2

У меня есть файл .MAP, который создается из XML-преобразователя SAS. Как следует из названия, файл получается из файла XML. Теперь я хочу вставить данные из этого файла в таблицы SQL Server 2008. Файл .MAP содержит данные для почти 28 таблиц. Есть ли способ импортировать такие огромные данные?Импорт XML-данных на SQL-сервере 2008

Это образец файла .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? –

+0

@marc_s. Я редактировал свой вопрос с частью файла .MAP. У него может быть много данных/строк и. В некоторых местах он будет иметь 2-3 иерархических уровня, и, как я уже сказал, он содержит данные, которые, если они каким-то образом вставлены, будут влиять на 28 таблиц. –

ответ

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 и помещать его в промежуточный реляционный формат, который затем можно использовать для продолжения (и поместить данные там, где он elongs, в конце)

Смежные вопросы