【问题标题】:How to serialize and deserialize results of SQL queries in generic way如何以通用方式序列化和反序列化 SQL 查询的结果
【发布时间】:2012-01-15 04:06:09
【问题描述】:

我对@9​​87654321@ 的回答不满意。

我对第 3 方解决方案不感兴趣,因为这应该是我自己解决的简单问题。

我正在寻找Caching of Linq queries 的替代解决方案,它适用于任何 SQL 查询,而不仅仅是 Linq。理想的解决方案是拥有像 execsql @Sql,@HashCode 这样的存储过程,它会通过 HashCode 查询序列化结果表,如果存在则返回结果,否则运行查询,将序列化结果保存在结果表中并返回。当然,返回的结果必须具有与未存储时相同的结构。

在这种情况下,我们不必担心缓存过期/垃圾清理或其他可能的性能问题。

为了做到这一点,我需要能够检测 SQL 查询的哈希码(我想 SQL 查询字符串上的 GetHashCode 就可以了),序列化和反序列化查询结果。

考虑到查询结果可能具有不同的结构,我认为使用FOR XML AUTO 将是序列化的一个很好的候选者。但是如何以通用的方式对其进行反序列化,以使代码不依赖于结果结构?

如果需要,该解决方案可以使用 Sql 2008 功能。

【问题讨论】:

  • Caching ... should be a sinple problem to solve...:我希望这是真的。不是。是最难解决的问题之一。

标签: sql sql-server caching serialization


【解决方案1】:

你可以这样(一个存储过程,它会等待你的表函数和你的参数连接:

CacheService(tableFunctionName,parametersConcat)

IF(there_is_no_cache_table)
BEGIN
   execsql "SELECT * , "+parametersConcat+" as parametersConcat INTO cache_tableFunctionName "++" FROM dbo."+tableFunctionName+"("+parametersConcat+")"
END
ELSE IF(there_is_no_cache_entry_for_this_function_and_parameters)
BEGIN
   execsql "INSERT INTO cache_"+tableFunctionName+" SELECT * , "+parametersConcat+" FROM dbo."+tableFunctionName+"("+parametersConcat+")"
END
ELSE  
BEGIN
   execsql "SELECT *  FROM cache_"+tableFunctionName+" WHERE parametersConcat ='"+parametersConcat+"'"
END

编辑:小心 SQL 注入和一切这只是一个开始

编辑 2:您可能必须添加缓存条目创建日期,以便删除它们

【讨论】:

  • 在这种情况下,没有 OVER stackoverflow.com/questions/4810627/… 的 ROW_NUMBER() 对于序列化排序很有用。
  • 我错了 ROW_NUMBER() OVER (ORDER BY (SELECT 1)),它不保留排序,它只是添加唯一列。我必须提取 ORDER BY 并将其注入 OVER。
  • @alpav 你能把你的实现发布出来让其他人喜欢吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 2013-11-02
  • 2021-12-27
  • 1970-01-01
  • 2019-08-05
  • 2023-02-02
相关资源
最近更新 更多