Добавить строки в базу данных SQL Server из файла xml

Я занят преобразованием веб-сайта из файловой базы xml в экспресс-базу данных SQL Server 2012, теперь мне удалось без проблем получить большинство тегов из xml для импорта в SQL Server.

Теперь моя проблема связана с определенным разделом этих XML-файлов.

Это раздел, с которым у меня проблемы

<?xml version="1.0" encoding="utf-16"?>
<License xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<Reference>00b2d4cf-699c-4427-bcf0-a0ca456654c2</Reference>
 <MacAddresses>
  <string>00:0D:87:FE:9A:21</string>
  <string>00:20:ED:14:47:64</string>
  <string>00:13:D3:11:7C:D2</string>
  <string>00:13:D3:11:7C:D8</string>
  <string>00:19:D1:04:12:98</string>
  <string>00:19:66:C0:7F:AF</string>
 </MacAddresses>
</License>

У меня есть ссылка на каждую лицензию и MAC-адреса, назначенные этой лицензии.
Теперь я хочу, чтобы она импортировала ее в sql следующим образом:

Reference                               MACAddress
---------                               ----------
00b2d4cf-699c-4427-bcf0-a0ca456654c2    00:0D:87:FE:9A:21
00b2d4cf-699c-4427-bcf0-a0ca456654c2    00:20:ED:14:47:64
00b2d4cf-699c-4427-bcf0-a0ca456654c2    00:13:D3:11:7C:D2
00b2d4cf-699c-4427-bcf0-a0ca456654c2    00:13:D3:11:7C:D8
00b2d4cf-699c-4427-bcf0-a0ca456654c2    00:19:D1:04:12:98
00b2d4cf-699c-4427-bcf0-a0ca456654c2    00:19:D1:04:12:98
00b2d4cf-699c-4427-bcf0-a0ca456654c2    00:19:66:C0:7F:AF

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

помощь будет оценена


person NapalmKnight    schedule 20.05.2013    source источник
comment
Проанализируйте XML с помощью синтаксического анализатора XML и ВСТАВЬТЕ полученные данные.   -  person Robert Harvey    schedule 20.05.2013
comment
SQL – это всего лишь язык структурированных запросов – язык, используемый многими системами баз данных, но не являющийся продуктом базы данных... многие вещи, такие как поддержка XML в значительной степени зависят от поставщика, поэтому нам действительно нужно знать, какую систему базы данных (и какую версию) вы используете (пожалуйста, обновите теги соответствующим образом)....   -  person marc_s    schedule 20.05.2013
comment
@marc_s: есть ли у кого-нибудь из них поддержка импорта XML непосредственно в таблицу?   -  person Robert Harvey    schedule 20.05.2013
comment
@RobertHarvey: SQL Server имеет встроенную поддержку XQuery, и я полагаю, что Oracle и DB2 тоже что-то имеют (не знаю их подробно)   -  person marc_s    schedule 20.05.2013
comment
я использую mssql 2012 express в качестве продукта БД   -  person NapalmKnight    schedule 20.05.2013
comment
Текстовый редактор, глобальный поиск и замена <string> на INSERT INTO mytable VALUES(' и </string> на ') Затем, если вы можете заменить регулярными выражениями, удалите любую пустую строку или строку с < или >   -  person David Starkey    schedule 20.05.2013
comment
я использовал часть vbscript для импорта остальных данных в свои таблицы... только этот раздел, с которым я застрял:/   -  person NapalmKnight    schedule 20.05.2013


Ответы (1)


Если вы используете SQL Server 2005 или новее, вы можете использовать встроенную поддержку XQuery для извлечения нужных данных из этого XML следующим образом:

DECLARE @input XML = '<License xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<Reference>00b2d4cf-699c-4427-bcf0-a0ca456654c2</Reference>
 <MacAddresses>
  <string>00:0D:87:FE:9A:21</string>
  <string>00:20:ED:14:47:64</string>
  <string>00:13:D3:11:7C:D2</string>
  <string>00:13:D3:11:7C:D8</string>
  <string>00:19:D1:04:12:98</string>
  <string>00:19:66:C0:7F:AF</string>
 </MacAddresses>
</License>'

SELECT
    Reference = License.value('(Reference)[1]', 'varchar(50)'),
    MacAddress = MacAddr.value('.', 'varchar(50)')
FROM
    @input.nodes('License') AS XTbl1(License)
CROSS APPLY
    License.nodes('MacAddresses/string') AS XTbl2(MacAddr)

Дает вывод:

Reference                              MacAddress
00b2d4cf-699c-4427-bcf0-a0ca456654c2   00:0D:87:FE:9A:21
00b2d4cf-699c-4427-bcf0-a0ca456654c2   00:20:ED:14:47:64
00b2d4cf-699c-4427-bcf0-a0ca456654c2   00:13:D3:11:7C:D2
00b2d4cf-699c-4427-bcf0-a0ca456654c2   00:13:D3:11:7C:D8
00b2d4cf-699c-4427-bcf0-a0ca456654c2   00:19:D1:04:12:98
00b2d4cf-699c-4427-bcf0-a0ca456654c2   00:19:66:C0:7F:AF

И, конечно же, вы также можете использовать INSERT INTO dbo.YourTable(Reference, MacAddress) .... перед SELECT для автоматической вставки этих данных в таблицу.

person marc_s    schedule 20.05.2013