Champ varbinary(max) et Datalength

J’ai souvent travaillé avec des champs binaires pour stocker des images ou des documents associés à mes enregistrements.
Pour des raisons pratiques, je place le champ dans la même table que celle de l’objet qui l’utilise.

Pour des raisons évidentes de performance, je ne remonte jamais le binaire à chaque fois que j’ai besoin d’un enregistrement. J’ai des procédures séparées pour les opérations sur le binaire.
Seulement, j’ai besoin de savoir s’il y a ou non un binaire associé (vu que le champ est défini comme NULL) quand je remonte l’enregistrement.

Je ne peux pas tester la nullité du champ coté code car cela m’obligerai à remonter le champ binaire dans les cas où il ne serait pas vide.
J’utilise donc la technique suivante :

Select ISNULL(Datalength(MonChampImage),0) From dbo.MaTable

0 : il n’y a pas d’image
> 0 : il y a une image

La fonction DATALENGTH ne scanne pas l’ensemble du champ binaire pour obtenir sa taille. En revanche, une opération d’IO supplémentaire est tout de même faite pour pointer sur la racine de sa zone de stockage et obtenir la taille (explications sur ce blog : http://blogs.msdn.com/sqltips/archive/2006/07/14/666188.aspx)

Cette opération de lecture n’a jamais plombé les performances de mes sites mais pour l’éviter, on peut utiliser l’écriture suivante :

Select
  Case When MonChampImage Is Null
  Then 0 Else 1
  End
From dbo.MaTable

Ici, on teste directement la nullité du pointeur vers le binaire. Par contre, la syntaxe est un peu plus…large.

Biensur, je vous passe la solution de stocker un champ bit donnant directement l’information, mais j’aime me compliquer la vie ;-).

Quelques unes des règles à respecter toutefois :

  • stocker le type du binaire dans un champ associé, moi je stocke le MIME type
  • utiliser l’instruction TEXTIMAGE_ON à la création de la table pour stocker les binaires dans un FILEGROUP séparé

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s