Обновление таблицы SQL из XML - PullRequest
2 голосов
/ 28 апреля 2011

Я использую InfoPath 2007 для отправки опроса (он не подключен к SharePoint или базе данных). Файл, который я верну, является файлом XML. В каждом месте есть блок ответа, у него есть свой уникальный идентификатор (имя поля).

Теперь у меня есть база данных SQL Server (2007?) С таблицей «Ответы». Его столбцы: AnswerID (уникальный PK), QuestionID (FK) (который является уникальным идентификатором (именем поля), и Answer. QuestionID уже заполнен уникальным идентификатором (именем поля). Существует более 300 записей для QuestionID .

Что мне нужно сделать, это добраться до XML-файла, найти QuestionID (имя поля), получить данные для этого имени поля, а затем поместить данные в столбец БД «Ответ», соответствующий полю. имя в столбце QuestionID.

Есть ли простой / средний способ сделать это отображение / обновление с наименьшей вероятностью ошибки?

ПРИМЕЧАНИЕ: Я попытался использовать мастер импорта данных XML БД, информация разбивается на неуправляемое количество таблиц.

1 Ответ

2 голосов
/ 28 апреля 2011

Вы можете разбить XML на строки и столбцы, а затем использовать его для обновления таблицы. Вот небольшой пример того, что вы можете сделать.

create table Responses(QuestionID varchar(10), Answer varchar(10))

insert into Responses values('Q1', null)
insert into Responses values('Q2', null)
insert into Responses values('Q3', null)

declare @xml xml
set @xml = 
'<root>
  <question ID="Q1">Answer1</question>
  <question ID="Q2">Answer2</question>
  <question ID="Q3">Answer3</question>
 </root>'

;with cte as
(
  select 
    r.n.value('@ID', 'varchar(10)') as QuestionID,
    r.n.value('.', 'varchar(10)') as Answer
  from @xml.nodes('/root/*') as r(n)
)
update R
set Answer = C.Answer
from Responses as R
  inner join cte as C
    on R.QuestionID = C.QuestionID

select *
from Responses 

Результат:

QuestionID Answer
---------- ----------
Q1         Answer1
Q2         Answer2
Q3         Answer3

XML, который я использовал, наверняка не похож на то, что у вас есть, но он должен дать вам подсказку о том, что вы можете сделать. Если вы разместите образец своего XML-файла, структуру таблицы и ожидаемый результат / вывод, вы, вероятно, получите более точный ответ.

Редактировать

declare @xml xml = 
'<?xml version="1.0" encoding="UTF-8"?>
<my:myFields xmlns:my="xx.com" xml:lang="en-us">
  <my:group1>
    <my:group2>
      <my:field1>Im an analyst.</my:field1>
      <my:group3>
        <my:group4>
          <my:field2>1</my:field2>
          <my:field3>I click the mouse.</my:field3>
        </my:group4>
        <my:group4>
          <my:field2>2</my:field2>
          <my:field3>I type on the keyboard.</my:field3>
        </my:group4>
      </my:group3>
    </my:group2>
    <my:group2>
      <my:field1>Im a stay at home mom.</my:field1>
      <my:group3>
        <my:group4>
          <my:field2>1</my:field2>
          <my:field3>I Cook.</my:field3>
        </my:group4>
        <my:group4>
          <my:field2>2</my:field2>
          <my:field3>I clean.</my:field3>
        </my:group4>
      </my:group3>
    </my:group2>
  </my:group1>
</my:myFields>'

;with xmlnamespaces('xx.com' as my)
select 
  T.N.value('../../my:field1[1]', 'varchar(50)') as Field1,
  T.N.value('my:field2[1]', 'varchar(50)') as Field2,
  T.N.value('my:field3[1]', 'varchar(50)') as Field3
from @xml.nodes('my:myFields/my:group1/my:group2/my:group3/my:group4') as T(N)

Результат:

Field1                 Field2       Field3
Im an analyst.          1           I click the mouse.
Im an analyst.          2           I type on the keyboard.
Im a stay at home mom.  1           I Cook.
Im a stay at home mom.  2           I clean.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...