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