Pesquisar dados armazenados no banco de dados do Microsoft SQL Server
Você já precisou decifrar um banco de dados e identificar qual coluna possui os dados que você precisa?
Recentemente tive que trabalhar com extração de dados de um banco de dados SQL para usar no Microsoft Access e Power BI, infelizmente a estrutura de nomenclatura do banco de dados não era muito intuitiva.
O único guia que eu tinha era um relatório mostrando um exemplo dos dados que precisavam ser extraídos, com rótulos que não tinham referência aos nomes das colunas. Isso poderia significar horas de trabalho pesquisando o banco de dados e revisando cada tabela, esse banco de dados em particular tinha 288 tabelas.
Eu usei código no passado para procurar uma coluna em tabelas, mas neste caso isso não me ajudaria.
Felizmente, me deparei com um artigo muito interessante https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, isso foi perfeito para minhas necessidades. Eu simplesmente precisava definir a variável com o texto que estava procurando e executar o código. Em questão de segundos, recebi uma lista das tabelas e colunas onde o texto aparecia. Em pouco tempo, eu tinha uma lista das tabelas e colunas que precisava incluir no meu projeto.
Observe que esta solução se aplica apenas a tabelas do SQL Server e é executada no SQL Server Management Studio. Você também precisa ter uma instância do SQL Server que dê suporte a variáveis de tabela.
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 isso ajude você também!