Искать имя столбца во всех базах данных

У меня есть этот запрос, который находит все таблицы и представления, которые соответствуют имени моего столбца определенной базы данных. Я использую SQL SERVER 2008

SELECT table_name FROM information_schema.columns
WHERE column_name = 'product_name'

Я хочу расширить возможности моего запроса для поиска во всех базах данных и даже искать хранимые процедуры, в которых есть имя моего искомого столбца.

7 ответов

Этот скрипт будет искать ваш столбец во всех таблицах во всех базах данных.

Create table #yourcolumndetails(DBaseName varchar(100), TableSchema varchar(50), TableName varchar(100),ColumnName varchar(100), DataType varchar(100), CharMaxLength varchar(100))

EXEC sp_MSForEachDB @command1='USE [?];
    INSERT INTO #yourcolumndetails SELECT
    Table_Catalog
    ,Table_Schema
    ,Table_Name
    ,Column_Name
    ,Data_Type
    ,Character_Maximum_Length
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME like ''%yourcolumnname%'''

select * from #yourcolumndetails
Drop table #yourcolumndetails 

Вы можете использовать этот запрос для поиска имени поля, которое использовалось в SP/View или Function

SELECT 
    OBJECT_NAME(object_id) as 'Procedure/Function/View Name',
    definition
    --,*
FROM sys.sql_modules
WHERE 
    ( definition LIKE '%' + '<Your_Field_Name>' + '%' )

Поиск кода между базами данных, самый простой способ, который я нашел, состоит в том, чтобы объединить представление с приведенным ниже SQL-кодом в каждой БД, а затем поместить в мастер-представление, объединяющее их в БД. Немного боли, если у вас есть множество БД или несколько, к которым вы не можете прикоснуться, но в остальном у меня это хорошо работает.

select
    s.name as SchemaName,
    objs.name as ObjectName,
    objs.ObjectType,
    OBJECT_DEFINITION(objs.object_id) AS ObjectDefinition
from
    (SELECT object_id, name, 'Proc' as ObjectType
    FROM    sys.procedures p
        UNION
    select  object_id, name, 'View'
    from    sys.views 
        UNION
    SELECT  object_id, Name, type
    FROM    sys.objects o
    WHERE   o.[type] IN ('fn', 'fs', 'ft', 'if', 'tf')) objs
    inner join sys.objects o
        on objs.object_id=o.object_id
    inner join sys.schemas s
        on o.schema_id=s.schema_id

Столбцы (как в поиске столбца в абстрактной таблице в любой базе данных на сервере), вы можете сделать то же самое и просто ОБЪЕДИНИТЬ информационные схемы, но это не сработает для того, что я хочу, поэтому я нахожусь в поиске более общее решение - добавлю его, если найду!

Для поиска в процедурах используйте information_schema.routines

select * from information_schema.tables
where table_name like upper('%email%'); '

Объясните:
Table_name - это имя столбца
все команды, которые помогли мне найти столбцы 'email' > Шаги:

show databases ;
show tables;
select * from information_schema.tables;

select * from information_schema.tables
where table_name like upper('%email%');'
      DECLARE @colName NVARCHAR(30)

ОБЪЯВИТЬ @insertCMD NVARCHAR(256)

CREATE TABLE #yourcolumndetails (DBaseName VARCHAR(100), TableSchema VARCHAR(50), TableName VARCHAR(100), ColumnName VARCHAR(100), DataType VARCHAR(100), CharMaxLength VARCHAR(100))

НАБОР @colName = UPPER('yourColumName')

НАБОР @colName = '' '%' + @colName + '%' ''

ПЕЧАТЬ @colName

SET @insertCMD = 'ИСПОЛЬЗОВАТЬ [?];INSERT INTO #yourcolumndetails SELECTTable_Catalog, Table_Schema, Table_Name, Column_Name, Data_Type, Character_Maximum_LengthFROM INFORMATION_SCHEMA.COLUMNSWHERE COLUMN_NAME как '+ @colName

ПЕЧАТЬ @insertCMD

EXEC sp_MSForEachDB @command1 = @insertCMD

ВЫБРАТЬ * ИЗ #yourcolumndetails

СБРОСИТЬ ТАБЛИЦУ #yourcolumndetails

Вы выполняете этот запрос без прав администратора MySQL, поэтому он показывает только те базы данных / таблицы, к которым у вас есть доступ

Другие вопросы по тегам