【问题标题】:Is there a way to make a query that looks in serialized binary object in SQL Server 2008?有没有办法在 SQL Server 2008 中的序列化二进制对象中进行查询?
【发布时间】:2011-08-08 07:54:49
【问题描述】:
我有一个名为 Data 的对象,序列化为 varbinary(MAX)。数据对象包含名为 Source 的属性。有没有办法制作类似的东西:
select * from content_table where Data.Source == 'Feed'
我知道使用 XML 序列化 (XQuery) 是可能的。但是在这种情况下不能改变序列化类型。
【问题讨论】:
标签:
c#
sql-server
serialization
deserialization
【解决方案1】:
如果您使用过BinaryFormatter,那么不,不是真的——至少,如果不对整个对象模型进行反序列化,这在数据库中通常是不可能的。这是一种未记录的格式,几乎没有提供即席查询。
注意:BinaryFormatter 不是 (IMO) 与物品存储相关的任何事情的好选择;我完全希望这会在某个时候咬你(即无法可靠地反序列化你存储的数据)。痛点:
- 与类型名称紧密相关;移动代码时可能会中断
- 与字段名称紧密相关;重构类时可能会中断(即使只是创建一个自动实现的属性也是一项重大更改)
- 倾向于包含比您预期更大的图表,尤其是通过事件
它当然也是特定于平台的,并且可能是特定于框架的。
说真的,我已经记不清这些年来我遇到的“我无法反序列化我的数据”问题的数量了......
有替代的二进制序列化器允许允许一些(有限的)通过阅读器检查数据的能力(不需要完全反序列化),并且可以不与类型元数据绑定(相反,它是基于契约的,允许反序列化为任何合适的类型模型 - 不仅仅是特定类型/版本。
然而,我真的怀疑这样的工作是否能在WHERE 子句等中达到任何接近效率的效果;您将需要 SQL/CLR 方法等。IMO,这里更好的方法是将所需的 filter 列作为数据存储在其他列中,允许您添加索引等。在极少数情况下,我已经使用了xml 类型,这与我在 there 所做的相同(有一点需要注意的是,您可以使用来自底层 xml 数据的“提升”计算+存储+索引列,这将'这里不可能 - 额外的列必须是明确的)。
【解决方案2】:
您可以使用SQL CLR 函数反序列化数据。但我怀疑它不会很快。这完全取决于序列化是如何完成的。如果库可用,那么一个简单的 CLR 函数应该可以很容易地查询数据。