Искать имя столбца во всех базах данных
У меня есть этот запрос, который находит все таблицы и представления, которые соответствуют имени моего столбца определенной базы данных. Я использую 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, поэтому он показывает только те базы данных / таблицы, к которым у вас есть доступ