2011-04-28 67 views
2

我正在使用InfoPath 2007發送調查(它未連接到SharePoint或數據庫)。我將找回的文件是一個XML文件。每個地方都有一個答案塊,它有自己獨特的ID(又名字段名稱)。從XML更新SQL表

現在,我有一個SQL Server數據庫(2007?)與表「響應」。它的列是:AnswerID(唯一PK),QuestionID(FK)(它是唯一的ID(字段名稱)和Answer。QuestionID已經填充了唯一的ID(字段名)。

我需要做的就是進入XML文件,找到QuestionID(字段名稱),獲取該字段名稱的數據,然後將數據放入匹配的數據庫列「Answer」中在QuestionID列的字段名

有一個簡單/中等方式來做到這一點映射/錯誤的機會最少的更新

注:?我試圖用數據庫導入XML數據嚮導,信息分解成無法管理的數量的表。

回答

2

您可以將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.