SQL Server : Passer plus de 4000 caractères à une fonction .Net (SQLCLR)
Dans l'exemple d'hier (Split de chaîne : http://blogs.codes-sources.com/christian/archive/2009/12/17/sql-server-cr-er-une-fonction-de-type-table-tvf-via-net-sqlclr-exemple-d-un-split-de-cha-ne.aspx) de ma fonction de type table écrite en C# et intégré dans le moteur de bases de données, vous aurez peut être remarqué que le premier argument de la fonction n'était qu'un nvarchar(4000).
Pour le nvarchar on ne peut rien changer, les paramètres de fonctions sont exclusivement Unicode, au moins il n'y a pas à jongler entre les pages de code. Par contre il est possible de jouer sur la taille des arguments, bien que cela ne soit à nouveau pas très documenté.
Reprenons la fonction appelée et ses paramètres.
public
static
IEnumerable Split(
SqlString input,
SqlString separator
)
On va tout d'abord limiter la taille du paramètre « separator », mettons à 10 caractères :
public
static
IEnumerable Split(
SqlString input,
[SqlFacet(MaxSize = 10)] SqlString separator
)
Pour cela on a ajouté un attribut devant ce paramètre (pour moi c'était une découverte que cette possibilité de mettre un attribut à cet endroit… Bon je ne suis pas développeur mais quand même). Son nom : SqlFacet qui permet de jouer sur les caractéristiques des types passés du ou vers le moteur : taille, précision, longueur, etc.
Pour le nvarchar(max), c'est aussi simple, au lieu de la valeur 10, la convention est de mettre -1 pour signaler que l'on peut utiliser la valeur maximale permise par le moteur (qui est pour le moment de 2Go de taille stockée pour les types caractères).
public
static
IEnumerable Split(
[SqlFacet(MaxSize = -1)] SqlString input,
[SqlFacet(MaxSize = 10)] SqlString separator
)
On recompile, on déploie et le tour est joué vous pourrez passer autant de caractères que souhaité !
Bonne longueur…
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :