¿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.