如何以通用方式序列化和反序列化SQL查询结果

如何以通用方式序列化和反序列化SQL查询结果,sql,sql-server,caching,serialization,Sql,Sql Server,Caching,Serialization,我对你的回答不满意 我对第三方解决方案不感兴趣,因为这应该是一个由我自己解决的简单问题 我正在寻找一种可用于任何SQL查询的替代解决方案,而不仅仅是Linq。理想的解决方案是使用execsql@Sql、@HashCode这样的存储过程,它将通过HashCode查询序列化结果表并返回结果(如果存在),否则运行查询,将序列化结果保存在结果表中并返回结果。当然,返回的结果必须具有与未存储结果相同的结构 在此上下文中,我们不必担心缓存过期/垃圾清理或其他可能的性能问题 为了做到这一点,我需要能够检测SQ

我对你的回答不满意

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

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

在此上下文中,我们不必担心缓存过期/垃圾清理或其他可能的性能问题

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

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

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

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

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的ROW_NUMBER()对序列化排序很有用。关于ROW_NUMBER()OVER(ORDER BY(选择1))我错了,它没有保留排序,只是添加了唯一的列。我必须将ORDER BY提取并注入到OVER中。@alpav您可以发布您的实现以便其他人可能会喜欢它吗?
缓存…应该是一个需要解决的单一问题…
:我希望这是真的。不是。是最难解决的问题之一。