Lorsque vous travaillez avec SQL Server, il est important de comprendre le concept de longueur des caractères, en particulier lors de l’utilisation des vues de gestion dynamique (DMV) telles que sys.dm_exec_sql_text. Dans cet article, nous explorerons comment la longueur des caractères est mesurée et comment elle peut affecter vos requêtes.
Commençons par examiner la DMV sys.dm_exec_sql_text, qui vous permet de récupérer les requêtes qui ont été exécutées sur votre système et qui sont toujours en cache. Il s’agit d’un utilitaire utile pour le dépannage et l’optimisation des performances. La DMV fournit deux colonnes, statement_start_offset et statement_end_offset, qui mesurent le “nombre de caractères” à partir du début et de la fin de la chaîne SQL.
Cependant, il y a un hic. La colonne [text] dans sys.dm_exec_sql_text est de type NVARCHAR(MAX), ce qui signifie qu’elle stocke des caractères Unicode. Il est important de noter que les caractères Unicode nécessitent plus d’espace de stockage que les caractères réguliers.
Jetons un coup d’œil à une requête exemple:
SELECT SUBSTRING(dest.text, (der.statement_start_offset / 2) + 1, (der.statement_end_offset - der.statement_start_offset) / 2 + 1), LEN(dest.text) AS LongueurCaractère, DATALENGTH(dest.text) AS LongueurDonnée, DATALENGTH(dest.text) / 2 AS DemiLongueurDonnée, der.statement_start_offset, der.statement_end_offset FROM sys.dm_exec_query_stats AS der CROSS APPLY sys.dm_exec_sql_text(der.sql_handle) AS dest WHERE der.statement_end_offset > -1
Dans cette requête, nous divisons statement_start_offset et statement_end_offset par 2 pour tenir compte du fait qu’ils mesurent des caractères Unicode. Nous utilisons également la fonction DATALENGTH pour obtenir la longueur réelle du texte, qui inclut l’octet utilisé pour identifier l’ensemble de caractères.
En utilisant cette requête modifiée, vous pouvez récupérer avec précision des instructions individuelles à partir d’une procédure stockée qui contient plusieurs instructions. La longueur des caractères sera correcte et la DATALENGTH reflétera l’espace de stockage réel utilisé.
Il est important de garder à l’esprit que lors de la manipulation de la longueur des caractères dans SQL Server, vous devez prendre en compte si les données sont stockées sous forme de caractères Unicode ou de caractères réguliers. Cela peut affecter la façon dont vous récupérez et manipulez les données.
Donc, la prochaine fois que vous rencontrerez des instructions ou des erreurs qui semblent étranges lors de l’utilisation de sys.dm_exec_sql_text, n’oubliez pas de tenir compte de la différence entre la longueur des caractères et la longueur des caractères Unicode. En comprenant ce concept, vous pouvez éviter les écueils potentiels et garantir des résultats précis dans vos requêtes SQL Server.