Published on

December 17, 2019

Explorando conceptos de SQL Server: Manejo de caracteres especiales en sesiones de eventos extendidos

¿Alguna vez te has preguntado cómo manejar caracteres especiales o emojis dentro de las sesiones de eventos extendidos en SQL Server? En este artículo, exploraremos los desafíos que plantean estos caracteres y discutiremos cómo transformar los datos para hacerlos más útiles.

Cuando se capturan caracteres especiales en una sesión de XE, los datos resultantes pueden ser bastante desagradables de trabajar. Sin embargo, aún podemos utilizar estos datos transformándolos. Una forma de hacer esto es utilizando la función replace para buscar y reemplazar ciertos patrones. Por ejemplo, podemos reemplazar “&# ” con “NCHAR(” y “;” con “) + “. Al utilizar la función NCHAR con los puntos de código de sustitución, podemos representar los caracteres en el formato deseado.

Aquí tienes un ejemplo de consulta que demuestra esta técnica:

SELECT NCHAR(55357) + NCHAR(56489);

Al ejecutar esta consulta, podemos representar fácilmente los datos extravagantes capturados en los detalles de la sesión de una forma más amigable para los humanos.

Sin embargo, para mostrar estos datos en un formato amigable para los humanos, necesitamos convertir parte de la consulta en una declaración de SQL dinámica. Esto nos permite construir una consulta que reúna todo y utilice el truco de NCHAR para representar visualmente los caracteres que esperamos.

Aquí tienes un ejemplo de cómo hacer esto:

DECLARE @DynSQL NVARCHAR(MAX);

WITH presel AS (
    SELECT
        event_data.value('(event/@name)[1]', 'varchar(50)') AS event_name,
        event_data.value('(event/@timestamp)[1]', 'varchar(50)') AS [TIMESTAMP],
        REPLACE(REPLACE(event_data.value('(event/action[@name="database_name"]/value)[1]', 'varchar(max)'),'&#','NCHAR('),';',') + ') AS DBName
    FROM(
        SELECT CONVERT(XML, t2.event_data) AS event_data
        FROM (
            SELECT target_data = convert(XML, target_data)
            FROM sys.dm_xe_session_targets t
            INNER JOIN sys.dm_xe_sessions s 
            ON t.event_session_address = s.address
            WHERE t.target_name = 'event_file'
            AND s.name = N' '
        ) cte1
        CROSS APPLY cte1.target_data.nodes('//EventFileTarget/File') FileEvent(FileTarget)
        CROSS APPLY  sys.fn_xe_file_target_read_file(FileEvent.FileTarget.value('@name', 'varchar(1000)'), NULL, NULL, NULL) t2
    ) AS evts(event_data)
)

SELECT p.event_name,
       p.TIMESTAMP,
       LEFT(p.DBName, LEN(p.DBName) - 2) AS DBName
INTO #xedbnames
FROM presel p;

SELECT @DynSQL = 'SELECT p.event_name,
       p.TIMESTAMP,' + p.DBName + ' AS DBName
   FROM #xedbnames p'
FROM #xedbnames p;

EXECUTE (@DynSQL);

DROP TABLE #xedbnames;

En esta versión actualizada de la consulta, realizamos una coincidencia de patrones y reemplazo para los caracteres especiales. Luego volcamos los resultados en una tabla temporal y eliminamos los datos innecesarios. A partir de la tabla temporal, construimos una consulta dinámica que combina todo y utiliza el truco de NCHAR para representar visualmente los caracteres.

Al ejecutar esta consulta, ahora podemos tener una representación visual del nombre de la base de datos que coincide con lo que deberíamos ver dentro del árbol de objetos de SSMS. Esto facilita la revisión de los datos y ayuda a correlacionar con la base de datos correcta.

¿Qué hay de la destinación de histograma que se demostró en el artículo anterior? Los cambios para eso son similares. Aquí tienes un ejemplo:

DECLARE @DynSQL NVARCHAR(MAX);

WITH presel AS (
    SELECT 
        REPLACE(REPLACE(n.value('(value)[1]', 'nvarchar(60)'),'&#','NCHAR('),';',') + ') AS database_name,
        n.value('(@count)[1]', 'bigint') AS ghost_count
    FROM
    (
        SELECT CAST(target_data as XML) target_data
        FROM sys.dm_xe_sessions AS s 
        JOIN sys.dm_xe_session_targets t
        ON s.address = t.event_session_address
        WHERE s.name = N' '
        AND t.target_name = 'histogram'
    ) as tab
    CROSS APPLY target_data.nodes('HistogramTarget/Slot') as q(n)
)

SELECT p.ghost_count,
       LEFT(p.database_name, LEN(p.database_name) - 2) AS DBName
INTO #xedbnames
FROM presel p;

SELECT @DynSQL = 'SELECT p.ghost_count,
       ' + p.DBName + ' AS DBName
   FROM #xedbnames p'
FROM #xedbnames p;

EXECUTE (@DynSQL);

DROP TABLE #xedbnames;

Haciendo un poco más de esfuerzo en la preparación con estas consultas de T-SQL, podemos tener más facilidad para revisar los datos en las sesiones de XEvent. La representación visual de los datos facilita su comprensión y correlación con la base de datos correcta.

Jugar con emojis en una base de datos puede ser una tarea divertida. No solo permite el crecimiento personal, sino que también tiene ventajas comerciales. Los emojis se están volviendo más comunes e incluso se almacenan a largo plazo en muchas bases de datos. Al aprender cómo manejar caracteres especiales y emojis en SQL Server, puedes mejorar tus habilidades y mejorar tu carrera para el futuro.

¿Interesado en aprender más sobre SQL Server? Echa un vistazo a nuestros otros artículos sobre información técnica profunda o explora temas como el mantenimiento de índices o el tamaño de los índices.

Este artículo es parte de la serie “12 días de Navidad” de 2019. Para ver la lista completa de artículos, visita esta página.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.