¿Alguna vez ha tenido que descifrar una base de datos e identificar qué columna tiene los datos que necesita?
Recientemente tuve que trabajar con la extracción de datos de una base de datos SQL para usar en Microsoft Access y Power Bi, desafortunadamente la estructura de nombres de la base de datos no era muy intuitiva.
La única guía que tenía era un informe que mostraba un ejemplo de los datos que debían extraerse, con etiquetas que no tenían referencia a los nombres de las columnas. Esto podría haber significado horas de trabajo buscando en la base de datos y revisando cada tabla, esta base de datos en particular tenía 288 tablas.
He usado código en el pasado para buscar una columna en tablas, pero en este caso eso no me ayudaría.
Afortunadamente, me encontré con un artículo muy interesante https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, esto fue perfecto para mis necesidades Simplemente necesitaba establecer la variable con el texto que estaba buscando y ejecutar el código. En cuestión de segundos recibí una lista de las tablas y columnas donde apareció el texto. En poco tiempo tenía una lista de las tablas y columnas que necesitaba incluir en mi proyecto.
Tenga en cuenta que esta solución se aplica solo a las tablas de SQL Server y se ejecuta en SQL Server Management Studio. También debe tener una instancia de SQL Server que admita variables de tabla.
USE DATABASE_NAME
DECLARE @SearchStr nvarchar(100) = 'SEARCH_TEXT'
DECLARE @Results TABLE (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
SET NOCOUNT ON
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
) = 0
)
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)
IF @ColumnName IS NOT NULL
BEGIN
INSERT INTO @Results
EXEC
(
'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
)
END
END
END
SELECT ColumnName, ColumnValue FROM @Results
¡Espero que esto también te ayude!
Deja tu comentario