我有一个创建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属性的元素都可以在其父元素中多次发生--这是datefilter中的filter例外。
但这是一种学术性的结构,问题更为根本:
当请求通过时,像这样的XML会作为参数发送给SQLServer,作为存储的proc的参数。这个XML被分解成一个非规范化的表,然后迭代地写到标准化的表中,比如tblDataRequest (DataRequestID PK)、tblDataTask、tblFilter、tblSeries。这很好。
当我想要将给定的XML定义与DB中已经保存的定义匹配时,就会出现这个问题。我现在是通过..。
WHERE条件进行匹配(34行长)..This将返回与给定的DataRequestID完全匹配的任何DataRequestID。我担心这种方法最终会缓慢得令人痛苦--部分原因是我不相信CTE会做任何聪明的过滤,在应用庞大的WHERE之前,它每次都会提取所有数据。
我认为一定有更好的解决办法
datarequest时,还以某种方式存储数据请求的散列,并在此基础上进行简单匹配。在发生碰撞的情况下,使用当前方法。不过,我想用集合逻辑来做这件事。此外,我还关注XML中不相关的小差异,改变散列伪空间等等。IN的一部分来匹配系列。使用它作为IN的一部分来匹配DataTasks等等。问题是,当我考虑这个问题太久时,我就开始昏厥。基本上--以前有没有人遇到过这样的问题(他们肯定遇到过)。解决这个问题的推荐路线是什么呢?示例(伪)代码将是很棒的:)
发布于 2013-07-25 15:01:51
为了消除微小变化的可能性,我会通过XML转换(XSLT)运行请求。
或者,由于您已经获得了将其解析为一个非规范的暂存表的代码,所以这也很好。然后,我只需使用对于XML创建一个新的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
只要XML不超过8000字节,我的首选是创建一个唯一的字符串(如果您有特殊的字符支持,则创建一个惟一的字符串( VARCHAR(8000)或NVARCHAR(4000) ),并在该列上创建一个唯一的索引。
https://stackoverflow.com/questions/12674327
复制相似问题