Existe-t-il un moyen de créer une requête qui s'intéresse à l'object binary sérialisé dans SQL Server 2008?

J'ai un object appelé Données sérialisées comme varbinary (MAX). L'object de données contient la propriété nommée Source. Y a-t-il un moyen de faire quelque chose de similaire?

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

Je sais que c'est possible quand la serialization XML est utilisée (XQuery). Mais le type de serialization ne peut pas être modifié dans ce cas.

Si vous avez utilisé BinaryFormatter , alors non, pas vraiment – du less, pas sans déseriliser le model d'object entier, ce qui n'est généralement pas possible dans la database. C'est un format non documenté, avec très peu de dispositions pour les requêtes ad-hoc.

Remarque: BinaryFormatter n'est pas (OMI) un bon choix pour tout ce qui concerne le stockage des éléments; Je m'attends à ce que cela vous morde à un moment donné (c'est-à-dire incapable de désérialiser de manière fiable datatables que vous avez stockées). Points douloureux:

  • étroitement lié aux noms de type; peut casser comme vous déplacez le code autour
  • étroitement lié aux noms de champs; peut casser pendant que vous refactorisez vos classs (même la simple création d'une propriété implémentée automatiquement est un changement de rupture)
  • enclins à inclure un graphique plus grand que prévu, en particulier via des events

Il est bien sûr également spécifique à la plate-forme et potentiellement spécifique au cadre.

En toute sincérité, j'ai perdu le count du nombre de questions «Je ne peux pas désérialiser mes données» que j'ai posées au cours des années …

Il existe d' autres sérialiseurs binarys qui permettent une capacité (limitée) d'inspecter datatables via un lecteur (sans déserialization complète) et qui ne sont pas liés aux métadonnées de type (à la place, basées sur des contrats, permettant la déserialization type de model – pas seulement ce type / version spécifique .

Cependant , je doute vraiment qu'un tel travail fonctionne avec quelque chose approchant l'efficacité dans une clause WHERE etc. vous auriez besoin d'une méthode SQL / CLR etc. IMO, une meilleure approche ici est simplement de stocker les colonnes de filter requirejses comme données dans d'autres colonnes, ce qui vous permet d'append l'indexing etc Dans les rares occasions où j'ai utilisé le type xml , est le même que je l'ai fait (avec la petite mise en garde que vous pouvez utiliser des colonnes "levées" calculées + stockées + indexées des données xml sous-jacentes, ce qui ne serait pas possible ici – les colonnes supplémentaires devraient être explicites).

Vous pouvez désérialiser datatables en utilisant une fonction SQL CLR . Mais je soupçonne que ce ne sera pas rapide. Tout dépend de la façon dont la serialization a été faite. Si la bibliothèque est disponible, alors une simple fonction CLR devrait pouvoir interroger datatables assez facilement.