2016-05-20 4 views
1

У меня есть база данных, которая в формате XML содержит как структуру, так и данные, но у меня нет базы данных для импорта данных из XML.Импорт XML-файла в SQL Server без базы данных (таблицы)

Есть ли способ импортировать XML-файл в SQL Server, чтобы SQL Server читал XML-файл и впоследствии создавал структуры таблиц и вставлял данные в эти таблицы? Или существует ли какая-либо методология для преобразования XML-файла в таблицы базы данных с использованием служб SSIS?

Пример кода:

<?xml version="1.0" standalone="yes"?> 
<NewDataSet> 
    <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="dbo.AWB_Location_detail" msdata:UseCurrentLocale="true"> 
     <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
      <xs:element name="dbo.AWB_Location_detail"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="Stock_Id" type="xs:int" /> 
       <xs:element name="LocationId" type="xs:int" /> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:choice> 
     </xs:complexType> 
    </xs:element> 
    </xs:schema> 
    <dbo.AWB_Location_detail> 
    <Stock_Id>1</Stock_Id> 
    <LocationId>2</LocationId> 
    </NewDataSet> 
+0

Там нет достаточного встроенного инструмента для создания полностью strctured базы данных из XML-- AFAIK ... Пожалуйста, покажите (уменьшенный) пример вашего XML ... – Shnugo

+0

hi shungo добавил код ... pls review it –

+0

Есть ли только одна таблица (AWB_Location_Detail) с двумя столбцами в этом XML? Пожалуйста, добавьте немного больше вашего раздела данных, особенно если есть несколько строк ... – Shnugo

ответ

0

Следующая очень Hacky и - наверняка - не подходит для всех таблиц ...

Нам нужно временную таблицу

CREATE TABLE #tblXMLTables(TableName NVARCHAR(150),Content XML); 

С этим вы можете вставить один из своих файлов в

DECLARE @oneTableXML XML= 
(
    SELECT CAST(BulkColumn AS XML) FROM (SELECT BulkColumn FROM OPENROWSET(BULK 'F:\test.xml',SINGLE_BLOB) AS x) AS y 
); 

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema' AS xs 
        ,'urn:schemas-microsoft-com:xml-msdata' AS msdata) 
INSERT INTO #tblXMLTables(TableName,Content) 
SELECT REPLACE(@oneTableXML.value('(/NewDataSet/xs:schema/xs:element/@msdata:MainDataTable)[1]','nvarchar(max)'),'dbo.','') 
     ,@oneTableXML; 

После того как вы заполнили все ваши XMLs в темп-таблицы Вы можете использовать этот код:

Внимание: Вам придется иметь дело с NULL/NOT NULL, ограничения, внешние ключи, индексы и т.д. вручную ... И это будет работать только с «простыми» столбцами. Если таблица имеет дело с более сложными структурами, вам придется изменить код соответственно ...

DECLARE @tn NVARCHAR(250); 
DECLARE @columns NVARCHAR(MAX); 
DECLARE @cmd NVARCHAR(MAX); 
DECLARE tableName CURSOR FOR SELECT TableName FROM #tblXMLTables; 
OPEN tableName; 
FETCH NEXT FROM tableName INTO @tn; 
WHILE @@FETCH_STATUS=0 
BEGIN 
    SET @columns= 
    STUFF(
    (
     SELECT ',A.B.value(''' + A.B.value('@name','nvarchar(max)') + '[1]'',''' + REPLACE(A.B.value('@type','nvarchar(max)'),'xs:','') + ''') AS ' + A.B.value('@name','nvarchar(max)') 
     FROM #tblXMLTables 
     CROSS APPLY Content.nodes('//*:sequence/*:element') AS A(B) 
     WHERE [email protected] 
     FOR XML PATH('') 
    ),1,1,''); 

    SET @cmd= 
    'SELECT ' + @columns + 
    ' INTO [' + @tn + '] 
    FROM #tblXMLTables 
    CROSS APPLY Content.nodes(''//dbo.' + @tn + ''') AS A(B) 
    WHERE TableName=''' + @tn + ''';' 
    ; 

    PRINT @cmd; 
    EXEC(@cmd) 

    SET @cmd='SELECT * FROM ' + @tn; 
    EXEC(@cmd); 

    FETCH NEXT FROM tableName INTO @tn; 
END 
CLOSE tableName 
DEALLOCATE tableName; 
GO 

--Clean Up 
--DROP TABLE #tblXMLTables; 
0

Это выглядит как XML вы хотите импортировать только объект .net DataSet сохраняется как XML. Несколько лет назад я написал небольшую библиотеку .Net, которая создаст соответствующие таблицы sql и импортирует данные методом BulkCopy в SQL Server.

Хотя это не чистое решение SQL, его относительно легко реализовать. В следующем примере кода показано, как использовать библиотеку.

 SqlConnectionStringBuilder connectionBuilder = new SqlConnectionStringBuilder(); 

     connectionBuilder.ApplicationName = "Import"; 
     connectionBuilder.ConnectTimeout = 30; 
     connectionBuilder.DataSource = "(local)"; 
     connectionBuilder.InitialCatalog = "CodeExamples"; 
     connectionBuilder.IntegratedSecurity = true; 

     string connectionString = connectionBuilder.ConnectionString; 

     DataSet dataSet = new DataSet(); 
     dataSet.ReadXml(@"C:\temp\xmlData.xml"); 

     foreach (DataTable table in dataSet.Tables) 
     { 
      SqlTableManager tableManager = new SqlTableManager(table, connectionString); 
      tableManager.SyncTableSchemas(); 
      tableManager.UploadTableToSql(); 
     } 

Я загрузил код в файл капельница см ссылку ниже:

http://www.filedropper.com/sqltablemanagement

Ниже приводится ссылка на демо-приложения и код.

http://www.filedropper.com/sqltablemanagementdemo

Ниже ссылка, которая демонстрирует использование нескольких файлов:

http://www.filedropper.com/sqldatamanagmentdemo2

+0

Я хотел бы выполнить весь файл * .xml в данной папке. –

+0

demo отлично работает с одним исполнением файла .xml с просьбой предоставить полную версию sqltablemanagement. –

+0

Предоставленная библиотека - это полная библиотека, демонстрация которой просто демонстрирует использование. Я включил обновленную версию демо (только DLL), которая будет загружать несколько файлов. –

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