我正在尝试加载XML文档(下面是我如何接收文件的示例。我可以读取xml,但我无法将数据插入表中。任何帮助都会很感激。
<xml xmlns:dt="urn:dt" xmlns:msxsl="urn:schemas-microsoft-com:xslt" dateofservice="1/1/2016 10:00" mmsid="201599999999" userid="dxxxxx9-xxx0-xxdb-xxx0-e8xxxxxxbcd" npid="dfxxxxx9-6xx0-xxxx-bxx0-exxxc1xxxxxd" surveyid="xxxxxxx-xxxa-exxx-8xxx-xxxx56xxxxefb" memberid="sqlsrfr">
<response qid="801" debug="7" value="H" element="select" />
<response qid="150" debug="8" value="Surfer" element="input" mapfield="lastname" />
<response qid="109" debug="9" value="Sequel" element="input" mapfield="firstname" />
<response qid="57" debug="11" value="01/01/1901" element="input" mapfield="dob" />
<response qid="56" debug="12" value="M" element="input" type="radio" aid="85" />
<response qid="78" debug="13" value="123 Sequel Lane" element="textarea" mapfield="addr1" />
<response qid="126" debug="39" value="Stuff" element="input" row="9" placeholder="Placeholder Desc" customtype="disabled" />
<response qid="128" debug="40" value="Stuff" element="input" row="9" placeholder="Placeholder Desc" customtype="disabled" />
<response qid="305" debug="41" value="More words" element="input" row="9" placeholder="Placeholder Desc" customtype="normal" />
<response qid="579" debug="330" value="1" element="input" type="radio" />
<response qid="580" debug="331" value="1" element="input" type="radio" />
<response qid="716" value="Words for value" calc="1" screening="1" />
<response qid="779" value="More words for value" calc="1" highriskdrug="1" />
- <surveyevents>
<event name="Event Name 2.0.3.7" time="1451495565657" count="1" />
<event name="s2" time="1451495568305" count="2" last="1451495728416" />
<event name="s3" time="1451495577298" count="1" />
<event name="s18" time="1451495601418" count="1" />
<event name="Event Name 2.0.3.7" time="1451495725279" count="1" />
<event name="Event Name 2.0.4.1" time="1453394485181" count="1" />
</surveyevents>
<recapturedata />
</xml>
答案 0 :(得分:1)
鉴于您设法将XML读入变量,完整(非规范化)查询是这样的:
您必须为MetaData,ResponseData和EventData设计三个表,并在那里插入数据。
如果您需要创建一种ID,请查看ROW_NUMBER() OVER()
btw:未使用声明的命名空间...并自己定义拟合数据类型(我只使用varchar(max)
或int
)。
WITH XMLNAMESPACES('urn:dt' AS dt
,'urn:schemas-microsoft-com:xslt' AS msxsl)
,MetaData AS
(
SELECT @xml.value('/xml[1]/@dateofservice','varchar(max)') AS md_DateOfService
,@xml.value('/xml[1]/@mmsid','varchar(max)') AS md_MmsID
,@xml.value('/xml[1]/@userid','varchar(max)') AS md_UserID
,@xml.value('/xml[1]/@npid','varchar(max)') AS md_NpID
,@xml.value('/xml[1]/@surveyid','varchar(max)') AS md_SurveyID
,@xml.value('/xml[1]/@memberid','varchar(max)') AS md_MemberID
,@xml.query('.') AS XMLNode
)
SELECT md.md_DateOfService
,md.md_MmsID
,md.md_UserID
,md.md_NpID
,md.md_SurveyID
,md.md_MemberID
,response.value('@qid','int') AS resp_qID
,response.value('@debug','int') AS resp_Debug
,response.value('@value','varchar(max)') AS resp_Value
,response.value('@element','varchar(max)') AS resp_Element
,response.value('@row','int') AS resp_Row
,response.value('@mapfield','varchar(max)') AS resp_MapField
,response.value('@type','varchar(max)') AS resp_Type
,response.value('@aid','int') AS resp_aID
,response.value('@placeholder','varchar(max)') AS resp_Placeholder
,response.value('@customtype','varchar(max)') AS resp_CustomType
,EventRow.value('@name','varchar(max)') AS evnt_Name
,EventRow.value('@time','varchar(max)') AS evnt_Time
,EventRow.value('@count','int') AS evnt_Count
,EventRow.value('@last','varchar(max)') AS evnt_Last
FROM MetaData AS md
CROSS APPLY md.XMLNode.nodes('/xml/response') AS One(response)
CROSS APPLY md.XMLNode.nodes('/xml/surveyevents/event') AS The(EventRow)