Чи можна запитувати назви таблиць, які містять стовпці стовпців
LIKE '%myName%'
?
Чи можна запитувати назви таблиць, які містять стовпці стовпців
LIKE '%myName%'
?
Відповіді:
Пошукові таблиці:
SELECT c.name AS 'ColumnName'
,t.name AS 'TableName'
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE '%MyName%'
ORDER BY TableName
,ColumnName;
Пошукові таблиці та види:
SELECT COLUMN_NAME AS 'ColumnName'
,TABLE_NAME AS 'TableName'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%MyName%'
ORDER BY TableName
,ColumnName;
INFORMATION_SCHEMA
погляди, включені до SQL Server, відповідають стандартному визначенню ISO для INFORMATION_SCHEMA. , sys.columns
, sys.tables
Специфічно Microsoft SQL Server.
TABLE_SCHEMA
до списку вибору може бути корисним. Все-таки +1, тому що це хороша відповідь.
Ми також можемо використовувати наступний синтаксис:
select * from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME like '%clientid%'
order by TABLE_NAME
INFORMATION_SCHEMA
є частиною стандарту ANSI
SQL Server:
SELECT Table_Name, Column_Name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'YOUR_DATABASE'
AND COLUMN_NAME LIKE '%YOUR_COLUMN%'
Oracle:
SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE column_name LIKE '%YOUR_COLUMN_NAME%'
AND OWNER IN ('YOUR_SCHEMA_NAME');
select
s.[name] 'Schema',
t.[name] 'Table',
c.[name] 'Column',
d.[name] 'Data Type',
c.[max_length] 'Length',
d.[max_length] 'Max Length',
d.[precision] 'Precision',
c.[is_identity] 'Is Id',
c.[is_nullable] 'Is Nullable',
c.[is_computed] 'Is Computed',
d.[is_user_defined] 'Is UserDefined',
t.[modify_date] 'Date Modified',
t.[create_date] 'Date created'
from sys.schemas s
inner join sys.tables t
on s.schema_id = t.schema_id
inner join sys.columns c
on t.object_id = c.object_id
inner join sys.types d
on c.user_type_id = d.user_type_id
where c.name like '%ColumnName%'
Це дасть вам трохи додаткової інформації про схему, таблиці та стовпці, які ви можете або не можете використовувати додаткові умови у вашому пункті де фільтрувати. Наприклад, якщо ви хотіли бачити лише поля, які повинні мати значення
and c.is_nullable = 0
Ви можете додати інші умови, я також додав стовпці у пункті вибору цим вертикальним способом, щоб було легко змінити порядок, видалити, перейменувати або додати інші, залежно від ваших потреб. Крім того, ви можете шукати лише таблиці за допомогою T.Name. Це дуже настроюється.
Насолоджуйтесь.
Якщо ви більше вживаєте інструментів сторонніх виробників, є багато варіантів, таких як:
Вони дуже зручні, якщо у вашій базі даних є зашифровані об'єкти (перегляди, процедури, функції), оскільки ви не можете легко знайти їх за допомогою системних таблиць.
Я не знаю, чому так багато з вас, хто пропонує приєднатися до sys.table with sys.columns
вас, можуть просто використовувати код нижче:
Select object_name(object_id) as TableName,* from SYS.columns where name LIKE '%MyName%'
або
Якщо ви також хочете назву схеми:
Select * from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME LIKE '%MyName%'
Якщо ви просто хочете назву таблиці, можете запустити:
select object_name(object_id) from sys.columns
where name like '%received_at%'
Якщо ви також хочете ім'я схеми (що у багатьох випадках у вас буде, оскільки у вас буде багато різних схем, і якщо ви не можете запам’ятати кожну таблицю в базі даних і де вона належить, це може бути корисно):
select OBJECT_SCHEMA_NAME(object_id),object_name(object_id) from sys.columns
where name like '%received_at%'
і, нарешті, якщо ви хочете, щоб це було в більш приємному форматі (хоча тут код (на мій погляд) стає занадто складним для легкого написання):
select concat(OBJECT_SCHEMA_NAME(object_id),'.',object_name(object_id)) from sys.columns
where name like '%received_at%'
Зауважте, ви також можете створити функцію на основі того, що у мене є:
CREATE PROCEDURE usp_tablecheck
--Scan through all tables to identify all tables with columns that have the provided string
--Stephen B
@name nvarchar(200)
AS
SELECT CONCAT(OBJECT_SCHEMA_NAME(object_id),'.',object_name(object_id)) AS [Table Name], name AS [Column] FROM sys.columns
WHERE name LIKE CONCAT('%',@name,'%')
ORDER BY [Table Name] ASC, [Column] ASC
GO
Варто зазначити, що функція concat була додана у 2012 році. Для 2008r2 та попередньої версії використовуйте + для об'єднання рядків.
Я трохи переформатував програму, оскільки опублікував це. Зараз він трохи просунутіший, але виглядає набагато складніше (але він є в програмі, тому ви його ніколи не побачите), і він відформатований краще.
Ця версія дозволяє мати її в адміністративній базі даних, а потім здійснювати пошук у будь-якій базі даних. Зміна decleration з @db
з 'master'
в залежності від того , ви хочете , бази даних за замовчуванням , щоб бути (Примітка: з допомогою функції CONCAT () буде працювати тільки з 2012+ , якщо ви зміните конкатенації використовувати +
оператори).
CREATE PROCEDURE [dbo].[usp_tablecheck]
--Scan through all tables to identify all tables in the specified database with columns that have the provided string
--Stephen B
@name nvarchar(200)
,@db nvarchar(200) = 'master'
AS
DECLARE @sql nvarchar(4000) = CONCAT('
SELECT concat(OBJECT_SCHEMA_NAME(col.object_id,DB_ID(''',@db,''')),''.'',object_name(col.object_id,DB_ID(''',@db,'''))) AS [Table Name]
,col.name AS [Column]
FROM ',@db,'.sys.columns col
LEFT JOIN ',@db,'.sys.objects ob
ON ob.object_id = col.object_id
WHERE
col.name LIKE CONCAT(''%'',''',@name,''',''%'')
AND ob.type =''U''
ORDER BY [Table Name] ASC
,[Column] ASC')
EXECUTE (@sql)
GO
SELECT [TABLE_NAME] ,
[INFORMATION_SCHEMA].COLUMNS.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE '%NAME%' ;
Наступний запит дасть вам точні назви таблиць бази даних, що мають ім'я поля типу "% myName".
SELECT distinct(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%myName%'
я тільки що спробував це, і це прекрасно працює
USE YourDatabseName
GO
SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%YourColumnName%'
ORDER BY schema_name, table_name;
Змініть лише YourDatbaseName у вашій базі даних та YourcolumnName на назву стовпця, яку ви шукаєте, а решта збережіть її як є.
Сподіваюся, що це допомогло
DECLARE @columnName as varchar(100)
SET @columnName = 'ColumnName'
SELECT t.name AS Table, c.name AS Column,
ty.name AS Type, c.max_length AS Length
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
INNER JOIN sys.types ty ON c.system_type_id = ty.system_type_id
WHERE c.name LIKE @columnName
ORDER BY t.name, c.name
Сподіваємось, це не дублююча відповідь, але те, що я люблю робити, - це генерувати оператор sql в операторі sql, який дозволить мені шукати шукані значення (не тільки таблиці з тими назвами полів (як це зазвичай мені потрібно потім видалити будь-яку інформацію, пов’язану з ідентифікатором імені стовпця, який я шукаю):
SELECT 'Select * from ' + t.name + ' where ' + c.name + ' = 148' AS SQLToRun
FROM sys.columns c, c.name as ColName, t.name as TableName
JOIN sys.tables t
ON c.object_id = t.object_id
WHERE c.name LIKE '%ProjectID%'
Тоді я можу скопіювати та вставити запустити свій 1-й стовпчик "SQLToRun" ... потім я заміню "Вибрати * з" на "Видалити з", і це дозволяє мені видалити будь-які посилання на вказаний ідентифікатор! Запишіть ці результати у файл, щоб ви мати їх про всяк випадок.
ПРИМІТКА **** Переконайтеся, що ви видалили будь-які таблиці завантаження перед запуском оператора видалення ...
SELECT 'Delete from ' + t.name + ' where ' + c.name + ' = 148' AS SQLToRun
FROM sys.columns c, c.name as ColName, t.name as TableName
JOIN sys.tables t
ON c.object_id = t.object_id
WHERE c.name LIKE '%ProjectID%'
Як у Oracle, ви можете знайти таблиці та стовпці з цим:
select table_name, column_name
from user_tab_columns
where column_name
like '%myname%';
Мені хотілося чогось для столів та поглядів, які не змусили моїх очей кровоточити.
Запит
SELECT
t.TABLE_TYPE AS [Type],
c.TABLE_NAME AS [Object],
c.COLUMN_NAME AS [Column]
FROM
INFORMATION_SCHEMA.COLUMNS AS c
LEFT JOIN INFORMATION_SCHEMA.TABLES AS t ON
t.TABLE_CATALOG = c.TABLE_CATALOG AND
t.TABLE_SCHEMA = c.TABLE_SCHEMA AND
t.TABLE_NAME = c.TABLE_NAME
WHERE
c.COLUMN_NAME LIKE '%myName%'
ORDER BY
[Type],
[Object],
[Column]
Результат
Type Object Column
----------------------------
BASE TABLE Table1 myName1
BASE TABLE Table2 myName2
VIEW View1 myName1
VIEW View2 myName2
Просто для вдосконалення відповідей вище я включив перегляди та об'єднав схему та таблицю / перегляд разом, зробивши результати більш наочними.
DECLARE @COLUMNNAME AS VARCHAR(100);
SET @COLUMNNAME = '%Absence%';
SELECT CASE
WHEN [T].[NAME] IS NULL
THEN 'View'
WHEN [T].[NAME] = ''
THEN 'View'
ELSE 'Table'
END AS [TYPE], '[' + [S].[NAME] + '].' + '[' + CASE
WHEN [T].[NAME] IS NULL
THEN [V].[NAME]
WHEN [T].[NAME] = ''
THEN [V].[NAME]
ELSE [T].[NAME]
END + ']' AS [TABLE], [C].[NAME] AS [COLUMN]
FROM [SYS].[SCHEMAS] AS [S] LEFT JOIN [SYS].[TABLES] AS [T] ON [S].SCHEMA_ID = [T].SCHEMA_ID
LEFT JOIN [SYS].[VIEWS] AS [V] ON [S].SCHEMA_ID = [V].SCHEMA_ID
INNER JOIN [SYS].[COLUMNS] AS [C] ON [T].OBJECT_ID = [C].OBJECT_ID
OR
[V].OBJECT_ID = [C].OBJECT_ID
INNER JOIN [SYS].[TYPES] AS [TY] ON [C].[SYSTEM_TYPE_ID] = [TY].[SYSTEM_TYPE_ID]
WHERE [C].[NAME] LIKE @COLUMNNAME
GROUP BY '[' + [S].[NAME] + '].' + '[' + CASE
WHEN [T].[NAME] IS NULL
THEN [V].[NAME]
WHEN [T].[NAME] = ''
THEN [V].[NAME]
ELSE [T].[NAME]
END + ']', [T].[NAME], [C].[NAME], [S].[NAME]
ORDER BY '[' + [S].[NAME] + '].' + '[' + CASE
WHEN [T].[NAME] IS NULL
THEN [V].[NAME]
WHEN [T].[NAME] = ''
THEN [V].[NAME]
ELSE [T].[NAME]
END + ']', CASE
WHEN [T].[NAME] IS NULL
THEN 'View'
WHEN [T].[NAME] = ''
THEN 'View'
ELSE 'Table'
END, [T].[NAME], [C].[NAME];
Ви можете спробувати цей запит:
USE AdventureWorks
GO
SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%myName%'
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 ''origin'''
select * from #yourcolumndetails
Drop table #yourcolumndetails
Ось робоче рішення для бази даних Sybase
select
t.table_name,
c.column_name
from
systab as t key join systabcol as c
where
c.column_name = 'MyColumnName'
Ми можемо використовувати sp_columns
для мети.
sp_columns 'table name', null, null, '%column name%'