Знайдіть усі таблиці, що містять стовпчик із вказаним іменем - MS SQL Server


1202

Чи можна запитувати назви таблиць, які містять стовпці стовпців

LIKE '%myName%'

?


12
Існує дивовижний плагін для сервера sql, який може шукати всі типи об’єктів. SQL пошук red-gate.com/products/sql-development/sql-search
ВБП

1
@vbp: sql-пошук справді чудовий, але, як і багато інструментів, він не працює з SQL Server 2000 (так, на даний момент я застряг у цьому: - /)
Патрік Хонорес

2
@vbp Пошук ApexSQL для SSMS пропонує ще більше
Junchen Liu

Відповіді:


1848

Пошукові таблиці:

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;


4
Включення TABLE_SCHEMAдо списку вибору може бути корисним. Все-таки +1, тому що це хороша відповідь.
Бернхард Хофманн

1
Чи можете ви додати пояснення відмінностей між ними у свою відповідь, як це прокоментував @ user3185569?
Райан Гейтс

1
Другий працює також із SQL Server 2000, якщо вам трапиться скористатися цим
Патрік Хонорез

1
отримати схему таблиці також: SELECT c.name AS ColName, t.name AS TableName, SCHEMA_NAME (t.schema_id) AS SchemaName ....
Skorunka František

327

Ми також можемо використовувати наступний синтаксис:

select * from INFORMATION_SCHEMA.COLUMNS 
where COLUMN_NAME like '%clientid%' 
order by TABLE_NAME

10
Це працювало на мене, і відповідь не відповів (я використовую MariaDB).
Обрі Робертсон

3
Не дивно, що він працює на всіх тих різних базах даних, враховуючи те, що INFORMATION_SCHEMAє частиною стандарту ANSI
Давос,

179

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');
  • ПРОСТО ЯК ЦЕ!! (SQL, PL / SQL)
    Я використовую ВСЕ час, щоб знайти ВСІ екземпляри імені стовпця в заданій базі даних (схеми).

4
Я копіюю та вставляю цей SQL дуже часто, дякую @Todd_ECU
jonaglon

1
Це справді має бути прийнятою відповіддю. Вам не доведеться виконувати приєднання, що робить це набагато простіше, ніж прийнята відповідь
Колонь Каньйон

106
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. Це дуже настроюється.

Насолоджуйтесь.


3
д. [max_length] здається трохи марним. c. [max_length] - це, можливо, те, що ви мали на увазі. Але все одно голосуйте за те, щоб мене туди привезли.
користувач1566694

Ви можете поставити це в кінці свого запиту 🤫 "ЗАМОВИТИ по t.name"
Fuat

Користувач остерігайтесь. Наведений вище запит передбачає доступ до об'єкта 'sys', який не завжди відповідає дійсності. У моєму випадку, наприклад, що запит нічого не повертав. Натомість використання 'INFORMATION_SCHEMA' спрацювало як шарм.
OrizG

85

Це має працювати:

SELECT name 
FROM sysobjects 
WHERE id IN ( SELECT id 
              FROM syscolumns 
              WHERE name like '%column_name%' )

6
Я б користувався sys.tables замість sysobjects(що застаріло, як у SQL Server 2005)
marc_s

3
Недійсна назва стовпця "id"
JSON

62

Якщо ви більше вживаєте інструментів сторонніх виробників, є багато варіантів, таких як:

Вони дуже зручні, якщо у вашій базі даних є зашифровані об'єкти (перегляди, процедури, функції), оскільки ви не можете легко знайти їх за допомогою системних таблиць.


46

Я не знаю, чому так багато з вас, хто пропонує приєднатися до 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%'

1
Вони отримують назву схеми від sys.tables, можливо, це не є проблемою для вас, але це для багатьох людей.
K Kimble

Привіт, але все ще не потрібно приєднуватися до sys.objects для назви схеми, ви можете використовувати Select * з INFORMATION_SCHEMA.COLUMNS, де COLUMN_NAME LIKE '% MyName%'
користувач3583912

Приємно, що ви вказуєте на INFORMATION_SCHEMA.COLUMNS, однак, якщо ви запускаєте EXEC sp_helptext INFORMATION_SCHEMA.COLUMNS, ви можете бачити, що він дійсно робить те саме, і багато непотрібних інших речей, які вам можуть не знадобитися.
K Кімбл

40

Якщо ви просто хочете назву таблиці, можете запустити:

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

26
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 '%EmployeeID%'
ORDER BY schema_name, table_name; 

Це з блогу Pinal Sir Blog



23

Ви можете знайти його з INFORMATION_SCHEMA.COLUMNS за фільтром імен стовпців

Select DISTINCT TABLE_NAME as TableName,COLUMN_NAME as ColumnName
     From INFORMATION_SCHEMA.COLUMNS Where column_name like '%myname%'

21
SELECT  [TABLE_NAME] ,
        [INFORMATION_SCHEMA].COLUMNS.COLUMN_NAME
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE '%NAME%' ;

17

Наступний запит дасть вам точні назви таблиць бази даних, що мають ім'я поля типу "% myName".

SELECT distinct(TABLE_NAME)
  FROM INFORMATION_SCHEMA.COLUMNS    
 WHERE COLUMN_NAME LIKE '%myName%'

15

Для отримання повної інформації: назва стовпця, назва таблиці, а також схема таблиці ..

SELECT COLUMN_NAME, TABLE_NAME, TABLE_SCHEMA
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME LIKE '%col_Name%'

13

я тільки що спробував це, і це прекрасно працює

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 на назву стовпця, яку ви шукаєте, а решта збережіть її як є.

Сподіваюся, що це допомогло


8
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

7

Я використовував це з тією ж метою, і це спрацювало:

  select * from INFORMATION_SCHEMA.COLUMNS
  where TABLE_CATALOG= 'theDatabase'
  and COLUMN_NAME like 'theCol%'

6

Сподіваємось, це не дублююча відповідь, але те, що я люблю робити, - це генерувати оператор 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%'

6
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 '%Label%'
ORDER BY schema_name, table_name;

6

Як у Oracle, ви можете знайти таблиці та стовпці з цим:

select table_name, column_name
from user_tab_columns 
where column_name 
like '%myname%';

5

Мені хотілося чогось для столів та поглядів, які не змусили моїх очей кровоточити.

Запит

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

4

Просто для вдосконалення відповідей вище я включив перегляди та об'єднав схему та таблицю / перегляд разом, зробивши результати більш наочними.

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];

4

Ви можете спробувати цей запит:

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%'

1
Виглядає дуже схоже на blog.sqlauthority.com/2008/08/06/…, може допомогти з поясненнями, якщо нічого іншого.
користувач3428422

4

Ось відповідь на ваше запитання

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%';

3
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

Це те, що я шукав, рішення в будь-якій базі даних, а не лише в одній.
Fandango68

0

Ось робоче рішення для бази даних Sybase

select 
  t.table_name, 
  c.column_name 
from 
  systab as t key join systabcol as c 
where 
   c.column_name = 'MyColumnName'

2
Не працює. Неправильний синтаксис біля ключового слова "ключ".
Paiman Samadian


0

SQL-запит для відображення всіх таблиць із вказаною назвою стовпця:

SELECT SCHEMA_NAME(schema_id) + '.' + t.name AS 'Table Name'
  FROM sys.tables t
 INNER JOIN sys.columns c ON c.object_id = t.object_id
 WHERE c.name like '%ColumnName%'
 ORDER BY 'Table Name'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.