Buscando información en BD SQL Server

Siempre que se empieza a trabajar con una base de datos que no se conoce, se requiere una curva de aprendizaje para averiguar donde se almacenan ciertos datos, ver de que manera se relacionan, saber si hay algún trigger, procedimiento, función…que utiliza una tabla o un campo…
Esta curva de aprendizaje es imposible eliminarla, pero se puede reducir el tiempo invertido utilizando algunas queries que faciliten el trabajo. A continuación se detallan 3 de las que considero que más me han ayudado
Buscar columnas en tablas y vistas
Es útil cuando se quiere utilizar un campo (para leerlo o hacer alguna operación con él), se sabe que está en la base de datos, pero no dónde, en qué tabla o vista.
SELECT
COLUMN_NAME AS 'ColumnName',
TABLE_NAME AS 'TableName'
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
COLUMN_NAME LIKE '%NOMBRE_COLUMNA%'
ORDER BY
TableName,
ColumnName
Con la intención de mostrar un ejemplo, se ha lanzado la query sobre una base de datos AdventureWorks, buscando el campo JobTitle, siendo el resultado el que se muestra

Se puede apreciar, que el resultado son los nombres de las columnas encontradas y el objeto en el que se encuentran (tablas o vistas)
Buscar textos en bases de datos
Con la query anterior, se ha conseguido encontrar columnas en tablas o vistas, pero hay veces que se necesita saber si un cierto texto aparece en alguna estructura de la base de datos, no solo en tablas o vistas, sino también en triggers, procedimientos, funciones…
Para conseguirlo, se puede utilizar la consulta que se muestra a continuación
SELECT
[Scehma]=schema_name(o.schema_id),
o.Name,
o.type
FROM
sys.sql_modules m
INNER JOIN
sys.objects o ON o.object_id = m.object_id
WHERE
m.definition like '%TEXTO_BUSCADO%'
Como ejemplo, se ha buscado en la base de datos AdventureWorks el texto SalesOrderHeader, con el objetivo de saber dónde se puede estar llamando a la tabla que tiene ese nombre

Se aprecia, que el resultado son los nombres (acompañados de su esquema) en los que aparece el texto buscado, así como el tipo de la estructura (trigger, vista…)
Buscar transacciones pesadas
La última query que se va a exponer en este post la utilizo para buscar transacciones que se están ejecutando en la base de datos. Puede resultar muy útil, cuando notamos que nuestra base de datos tiene un comportamiento lento, pero no sabemos qué tareas está realizando. De esta forma, se pueden encontrar las transacciones culpables de este comportamiento y, así, poder actuar en consecuencia.
SELECT
r.start_time [Start Time],
session_ID [SPID],
DB_NAME(database_id) [Database],
SUBSTRING(t.text,(r.statement_start_offset/2)+1,
CASE WHEN statement_end_offset=-1 OR statement_end_offset=0
THEN (DATALENGTH(t.Text)-r.statement_start_offset/2)+1
ELSE (r.statement_end_offset-r.statement_start_offset)/2+1
END) [Executing SQL],
Status,command,
wait_type,
wait_time,
wait_resource,
last_wait_type
FROM
sys.dm_exec_requests r
OUTER APPLY
sys.dm_exec_sql_text(sql_handle) t
WHERE
session_id != @@SPID -- don't show this query
AND
session_id > 50 -- don't show system queries
ORDER BY
r.start_time
Se pueden encontrar más detalles sobre esta query en https://www.sqlmatters.com/Articles/See%20what%20queries%20are%20currently%20running.aspx
Espero que este post haya servido de ayuda y la próxima vez que os enfrentéis a una base de datos desconocida, lo hagáis de una manera algo más optimista. ¡¡Un saludo!!