Есть ли способ сделать запрос, который выглядит в сериализованном двоичном объекте в SQL Server 2008? - PullRequest
2 голосов
/ 08 августа 2011

У меня есть объект с именем Data, сериализованный как varbinary (MAX).Объект данных содержит свойство с именем Source.Есть ли способ сделать что-то похожее:

select * from content_table where Data.Source == 'Feed'

Я знаю, что это возможно при использовании сериализации XML (XQuery).Но тип сериализации в этом случае изменить нельзя.

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Если вы использовали BinaryFormatter, то нет, не совсем - по крайней мере, не без десерилизации всей объектной модели, что обычно невозможно в базе данных.Это недокументированный формат, с очень небольшим количеством специальных запросов.

Примечание: BinaryFormatter не является (IMO) хорошим выбором для всего, что связано с хранением элементов;Я полностью ожидаю, что это будет кусать вас в какой-то момент (т.е. не сможет надежно десериализовать данные, которые вы сохранили).Болевые точки:

  • плотно привязаны к именам типов;может сломаться при перемещении кода вокруг
  • , тесно связанного с именами полей;может сломаться при рефакторинге ваших классов (даже простое создание автоматически внедренного свойства является критическим изменением)
  • склонен к включению графика большего размера, чем вы ожидаете, в частности, через события

Это, конечно, также зависит от платформы и потенциально от структуры.

На полном серьезе я потерял счет из числа вопросов "Я не могу десериализовать свои данные"Я принимал участие в течение многих лет ...

Есть альтернативные двоичные сериализаторы , которые do позволяют некоторую (ограниченную) возможность проверять данные через считыватель (безтребующий полной десериализации), и которые не становятся привязанными к метаданным типа (вместо этого, на основе контракта, что позволяет десериализацию в любую подходящую модель типа - не только для конкретного типа / версии).

Однако , я искренне сомневаюсь, что такая работа работает с чем-то, что приближается к эффективности в предложении WHERE и т. Д .; вам понадобится SQL / CLRи т. д. IMO, лучший подход здесь - просто сохранить требуемые столбцы filter как данные в других столбцах, что позволяет добавлять индексацию и т. д. В тех редких случаях, когда я использовал тип xml,это то же самое, что я сделал там (с небольшим предупреждением, что вы можете использовать вычисленные + сохраненные + индексированные столбцы «поднял» из базовых данных XML, что было бы здесь невозможно - дополнительные столбцыдолжно быть явным).

0 голосов
/ 08 августа 2011

Вы можете десериализовать данные, используя функцию SQL CLR .Но я подозреваю, что это не будет быстро.Все зависит от того, как была проведена сериализация.Если библиотека доступна, то простая функция CLR позволит легко запрашивать данные.

...