我有一个创建的应用程序datarequests
这可能相当复杂。这些需要作为表存储在数据库中。一个轮廓datarequest
(作为 XML)将是...
<datarequest>
<datatask view="vw_ContractData" db="reporting" index="1">
<datefilter modifier="w0">
<filter index="1" datatype="d" column="Contract Date" param1="2009-10-19 12:00:00" param2="2012-09-27 12:00:00" daterange="" operation="Between" />
</datefilter>
<filters>
<alternation index="1">
<filter index="1" datatype="t" column="Department" param1="Stock" param2="" operation="Equals" />
</alternation>
<alternation index="2">
<filter index="1" datatype="t" column="Department" param1="HR" param2="" operation="Equals" />
</alternation>
</filters>
<series column="Turnaround" aggregate="avg" split="0" splitfield="" index="1">
<filters />
</series>
<series column="Requested 3" aggregate="avg" split="0" splitfield="" index="2">
<filters>
<alternation index="1">
<filter index="1" datatype="t" column="Worker" param1="Malcom" param2="" operation="Equals" />
</alternation>
</filters>
</series>
<series column="Requested 2" aggregate="avg" split="0" splitfield="" index="3">
<filters />
</series>
<series column="Reqested" aggregate="avg" split="0" splitfield="" index="4">
<filters />
</series>
</datatask>
</datarequest>
这对包含日期范围、主过滤器、系列和系列过滤器的数据请求进行编码。基本上任何具有以下特征的元素index
属性可以在其父元素中多次出现 - 例外情况是filter
within datefilter
.
但这个结构有点学术性,问题更根本:
当请求通过时,像这样的 XML 会作为存储过程的参数发送到 SQLServer。该 XML 被分解为非规范化表,然后迭代写入规范化表,例如tblDataRequest (DataRequestID PK)
, tblDataTask
, tblFilter
, tblSeries
。这可以。
当我想要的时候问题就出现了将给定的 XML 定义与数据库中已保存的定义进行匹配。我目前这样做是通过...
- 将 XML 分解为非规范化表
- 使用 CTE 拉动所有现有数据在数据库中转换为相同的非规范化形式
- 使用巨大的匹配
WHERE
条件(34行长)
..这将返回与给定 XML 完全匹配的任何 DataRequestID。我担心这种方法最终会变得非常缓慢 - 部分原因是我不相信 CTE 会进行任何巧妙的过滤,它每次都会提取所有数据before应用巨大的WHERE
.
我认为必须有更好的解决方案,例如
- 当存储一个
datarequest
,还以某种方式存储数据请求的哈希值并简单地进行匹配。如果发生碰撞,请使用当前方法。然而我想使用集合逻辑来做到这一点。而且,我担心 XML 中不相关的小差异会改变散列 - 虚假空格等。
- 以某种方式从下到上迭代地执行匹配。例如,生成在最低级别上匹配的过滤器列表。使用它作为
IN
匹配系列。使用它作为IN
匹配 DataTasks 等。问题是,当我想这个问题太久时,我开始昏厥。
基本上 - 有没有人曾经遇到过这种问题(他们一定遇到过)。解决这个问题的推荐路线是什么?示例(伪)代码会很棒:)
为了消除微小差异的可能性,我将通过 XML 转换 (XSLT) 运行请求。
或者,由于您已经获得了将其解析为非规范化暂存表的代码,这也很好。然后我会简单地使用FOR XML http://msdn.microsoft.com/en-us/library/ms178107.aspx创建一个新的 XML 文档。
您的目标是创建一个标准化的 XML 文档,该文档在适当的情况下遵守顺序,并在不符合顺序的情况下消除不一致之处。
完成后,将其存储在新表中。现在,您可以将“标准化”请求 XML 与现有数据进行直接比较。
要进行实际比较,您可以使用哈希,将 XML 存储为字符串并进行直接字符串比较,或者进行完整的 XML 比较,如下所示:http://beyondrelational.com/modules/2/blogs/28/posts/10317/xquery-lab-36-writing-a-tsql-function-to-compare-two-xml-values-part-2.aspx http://beyondrelational.com/modules/2/blogs/28/posts/10317/xquery-lab-36-writing-a-tsql-function-to-compare-two-xml-values-part-2.aspx
只要 XML 不超过 8000 字节,我的偏好就是创建一个唯一字符串(如果您有特殊字符支持,则为 VARCHAR(8000) 或 NVARCHAR(4000))并在列上创建唯一索引。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)