Buscar datos almacenados en la base de datos de Microsoft SQL Server
¿Alguna vez ha tenido que descifrar una base de datos e identificar qué columna tiene los datos que necesita?
Recientemente tuve que trabajar extrayendo datos de una base de datos SQL para usar en Microsoft Access y Power BI, lamentablemente 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 hací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 las tablas, pero en este caso eso no me ayudaría.
Por suerte, encontré un artículo muy interesante https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, fue perfecto para mis necesidades Simplemente necesitaba configurar la variable con el texto que estaba buscando y ejecutar el código. En cuestión de segundos se me proporcionó una lista de las tablas y columnas donde aparecía el texto. En poco tiempo tuve una lista de las tablas y columnas que necesitaba incluir en mi proyecto.
Tenga en cuenta que esta solución solo se aplica a las tablas de SQL Server y se ejecuta en SQL Server Management Studio. También necesita 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!