0

好的,所以我很确定我将不得不使用从 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。只是好奇是否有人能想到更好的方法。

4

1 回答 1

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>
于 2013-07-04T06:52:45.620 回答