Sql Server 2008 R2 - 使用未知架构粉碎XML

时间:2013-07-03 19:30:39

标签: sql-server xml sql-server-2008 openxml

好的,所以我很确定我将不得不使用由OPENXML生成的EDGE表。只是想检查一下没有更好的方法。

这是我使用OA和MSXML从http API直接导入SQL的XML。我编写了导入存储过程,并将xml存储为表中的XML数据类型。这是调查响应数据,因为每个调查都是不同的,并且可以随时间改变响应的元素/列未知。它们确实提供了调查的元数据,它使我获得了大约70%的模式,但是在元数据中不存在响应中的元素名称。我将其归因于他们为调查构建器添加了更多功能,包含更多对象,而不是在其API中考虑这些功能。

所以基本上

<xml>
  <response>
    <ResponseID>1</ReponseID>
    <Question1>Yes</Question1>
    <Question1_1_tag1>99</Question1>
  </response>
</xml>
  • 现实中的回应包含更多元素,如果调查问卷有100个问题,那么至少有100个元素

所以我可以从他们的元数据中获取ResponseID和Question1,但是我需要将Question1_tag1分解为任何给定调查的列,并且他们不提供xsd,而且他们的元数据中没有其他地方存在Question1_tag1但是它绝对是我的数据需要捕获并且在不同调查的每个结果集中发生这种情况的方式不同,我需要将其名称作为列并确定正确的数据类型。

只是一个注释我在这里进入了业务逻辑,因为在我读过的所有内容中,研究这个问题似乎非常罕见,通常当你遇到这个问题时,它需要获得需求并获得格式良好的数据并且只是想要解释在这种情况下我真的不能。

所以再次确定我必须使用边缘表编写自定义t-sql来粉碎xml。只是好奇,如果有人能想到更好的方法。

1 个答案:

答案 0 :(得分:0)

我认为,如果不进行大量的字符串操作来收集模式,然后使用动态SQL来提取数据,我认为不可能在SQL中完成。 如果您可以将XML模式更改为下面的通用内容,那么从SQL中解析将是小菜一碟:
选项1:

<xml>
    <response ResponseID="1">
        <Question QuestionID="1" QuestionTagID="1" ResponseValue="Yes" QuestionTagValue="99" />
        <Question QuestionID="2" QuestionTagID="3" ResponseValue="Perhaps" QuestionTagValue="91" />
    </response>
</xml>

选项2:

<xml>
    <Response ID="1">
        <Question ID="1">
            <ResponseValue>Yes</ResponseValue>
            <QuestionTagID>1</QuestionTagID>
            <QuestionTagValue>1</QuestionTagValue>
        </Question>
        <Question ID="2">
            <ResponseValue>Perhaps</ResponseValue>
            <QuestionTagID>3</QuestionTagID>
            <QuestionTagValue>1</QuestionTagValue>
        </Question>
    </Response>
</xml>