Как сериализовать и десериализовать результаты SQL-запросов в общем виде - PullRequest
0 голосов
/ 07 декабря 2011

Я не удовлетворен ответами на Кэширование SQL-запросов .

Меня не интересуют сторонние решения, потому что это должна быть простая проблема, которую я сам решу.

Я ищу альтернативное решение Кэширование запросов Linq , которое работает с любым запросом SQL, а не только с Linq.Идеальным решением было бы иметь хранимую процедуру, такую ​​как execsql @ Sql, @ HashCode, которая будет запрашивать таблицу сериализованных результатов с помощью HashCode и возвращать результат, если он существует, в противном случае выполнить запрос, сохранить сериализованный результат в таблице результатов и вернуть его.Конечно, возвращаемые результаты должны иметь такую ​​же структуру, как если бы они не были сохранены.

Давайте не будем беспокоиться об истечении срока действия кэша / очистке мусора или других возможных проблемах производительности в этом контексте.

Для того, чтобы сделатьчто мне нужно иметь возможность обнаруживать хеш-код SQL-запроса (я полагаю, GetHashCode в строке SQL-запроса подойдет), сериализовать и десериализовать результат запроса.

Учитывая, что результаты запроса могут иметь различную структуру, я полагаюэто использование FOR XML AUTO было бы хорошим кандидатом для сериализации.Но как десериализовать его универсальным способом, чтобы код не зависел от структуры результата?

При необходимости решение может использовать функции Sql 2008.

1 Ответ

1 голос
/ 07 декабря 2011

вы могли бы вот так (сохраненный процесс, который будет ожидать вашу табличную функцию и ваши параметры объединены:

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: возможно, вам придется добавить дату создания записи в кэш, чтобы вы могли удалить их

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...