我们有一个 xml 列,其中节点名称因站点而异(基本上,除了我们提供的标准字段外,我们还允许用户创建自定义字段,这些字段保存在我提到的 xml 列中。示例单元格看起来喜欢
<Dictionary><UnitNumber>56</UnitNumber><AptNo>12</AptNo></Dictionary>
请注意,节点 UnitNumber 和 AptNo 完全是客户特定的,它可以是 AutoBrand 和 ManifestNo 以及 TravelSite。
现在,我们允许客户查询这些字段。存储的 proc 获取一个 xml 参数,我们将该 xml 参数解析为一个临时表,该表如下所示
field value
----- -----
UnitNumber 56
AptNo 12
所以这个表就是客户作为where子句传入的(应该翻译成select * from t where UnitNumber = 56 and AptNo = 12)
然后我们从结果将来自的表中删除 xml 列。由于我们使用了 nodes() 函数和 OUTER APPLY,最终的 CTE 有一些重复的身份,因为它们有多个节点。
我们做xml粉碎的sql语句如下
SELECT T.C.value('local-name(.)', 'nvarchar(100)') as CustomFieldName,
T.C.value('.', 'nvarchar(100)') as CustomFieldValue,
#tempTable.*
FROM #tempTable
OUTER APPLY #tempTable.CustomFields.nodes('/Dictionary/child::*') as T(C)
这会返回类似
CustomFieldName CustomFieldValue EntityId
--------------- ---------------- ----------
UnitNumber 56 1
AptNo 12 1
UnitNumber 56 2
因此,当我们将 CTE 与临时表连接时,我们加入
CustomFieldName = field and CustomFieldValue = value
查询返回 entityId 1 和 entityId 2,但我希望它只返回 entityId 1,因为这是唯一同时满足这两个条件的实体
(UnitNumber = 56 AND AptNo = 12)
我还没有想出办法来实现这一点。当然,如果我们存储 CustomFields 的方式是结构化的,那将非常有帮助,但这是一个已建立的系统,现在无法更改。
任何提示表示赞赏。谢谢!