2016-04-06 3 views
2

Я хочу перенести данные в XML-файл в MS SQL Server 2016Перенос XML данных в Microsoft SQL Server 2016

Моя таблица fileds выглядит следующим образом:

[propertyid], [type], [object], [keyname], [keyvalue] 

Внутри данных таблицы будут отображаться с XML и будет выглядеть следующим образом:

1, community, Private Community, name, Private Community 
2, community, Private Community, communityname, Private Community 
3, community, Private Community, server, chip.xyz.com:423132 
4, community, Private Community, windowtitle, Private Community 
5, community, Private Community, websiteurl, http://something 

XML-файл выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<doc> 
<object type="community"> 
<name> 
<![CDATA[Private Community]]> 
</name> 
<communityname> 
<![CDATA[Private Community]]> 
</communityname> 
<server> 
<![CDATA[chip.xyz.com:423132]]> 
</server> 
<windowtitle> 
<![CDATA[Private Community]]> 
</windowtitle> 
<websiteurl> 
<![CDATA[http://something]]> 
</websiteurl> 
</object> 
</doc> 

Есть ли способ, я могу сделать это с помощью сценариев или какого-либо образом, потому что выше XML является лишь частью большого XML, который я использую, и имеющий много записей

+1

это поможет http://stackoverflow.com/questions/16838627/import-xml-into-sql-server – sashwat

ответ

0

Try это так:

DECLARE @xml XML= 
'<?xml version="1.0" encoding="UTF-8"?> 
<doc> 
    <object type="community"> 
    <name> 
Private Community 
</name> 
    <communityname> 
Private Community 
</communityname> 
    <server> 
chip.xyz.com:423132 
</server> 
    <windowtitle> 
Private Community 
</windowtitle> 
    <websiteurl> 
http://something 
</websiteurl> 
    </object> 
</doc>'; 

Я заменяю разрывы строк и обрезаю строки, надеюсь, что это соответствует вашим потребностям Что я не знаю: как структура, если есть больше данных. Мой запрос принимает doc как root, принимает doc/name как «тип» и все имена узлов как «имя ключа».

Используя «INTO MyNewlyCreatedTable», таблица с необходимой структурой создается «на лету». Если у вас есть свой стол уже, вы берете эту строку и написать выше примерочной INSERT INTO MyTable(colName1,colName2,...) с последующим SELECT ...

SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS propertyid 
     ,LTRIM(RTRIM(REPLACE(REPLACE(Doc.value('(object/@type)[1]','varchar(max)'),CHAR(13),''),CHAR(10),''))) AS [type] 
     ,LTRIM(RTRIM(REPLACE(REPLACE(Doc.value('(object/name)[1]','varchar(max)'),CHAR(13),''),CHAR(10),''))) AS [object] 
     ,LTRIM(RTRIM(REPLACE(REPLACE(Nod.value('local-name(.)','varchar(max)'),CHAR(13),''),CHAR(10),''))) AS keyname 
     ,LTRIM(RTRIM(REPLACE(REPLACE(Nod.value('.','varchar(max)'),CHAR(13),''),CHAR(10),''))) AS keyvalue 
INTO MyNewlyCreatedTable 
FROM @xml.nodes('/doc') AS A(Doc) 
CROSS APPLY Doc.nodes('object/*') AS B(Nod) 

на это содержание вновь созданной таблицы

SELECT * FROM MyNewlyCreatedTable; 

+------------+-----------+-------------------+---------------+---------------------+ 
| propertyid | type  | object   | keyname  | keyvalue   | 
+------------+-----------+-------------------+---------------+---------------------+ 
| 1   | community | Private Community | name   | Private Community | 
+------------+-----------+-------------------+---------------+---------------------+ 
| 2   | community | Private Community | communityname | Private Community | 
+------------+-----------+-------------------+---------------+---------------------+ 
| 3   | community | Private Community | server  | chip.xyz.com:423132 | 
+------------+-----------+-------------------+---------------+---------------------+ 
| 4   | community | Private Community | windowtitle | Private Community | 
+------------+-----------+-------------------+---------------+---------------------+ 
| 5   | community | Private Community | websiteurl | http://something | 
+------------+-----------+-------------------+---------------+---------------------+ 

Только для тестирования

--CleanUp 
DROP TABLE MyNewlyCreatedTable; 
Смежные вопросы