지정된 이름의 열이 포함 된 모든 테이블 찾기-MS SQL Server


1202

열이 포함 된 테이블 이름을 쿼리 할 수 ​​있습니까?

LIKE '%myName%'

?


12
모든 객체 유형을 검색 할 수있는 놀라운 SQL 서버 플러그인이 있습니다. SQL 검색 red-gate.com/products/sql-development/sql-search
Vbp

1
@vbp : SQL 검색은 참으로 매우 중요하지만, 많은 도구처럼, 그것은 SQL 서버 2000 (예, 나는이 순간에 그와 함께 붙어 있어요 : - /)로 일을하지 않습니다
패트릭 Honorez

2
@vbp SSMS에 대한 ApexSQL 검색은 더 많은 것을 제공합니다
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;

17
INFORMATION_SCHEMA SQL Server에 포함 된 @Revious 뷰는 INFORMATION_SCHEMA에 대한 ISO 표준 정의를 준수합니다. , sys.columns, sys.tables마이크로 소프트 SQL 서버 고유의 것입니다.
Tomasito

4
TABLE_SCHEMA선택 목록에 포함하면 도움이 될 수 있습니다. 좋은 답변이기 때문에 여전히 +1입니다.
Bernhard Hofmann

1
@ user3185569의 의견에 따라 둘 사이의 차이점에 대한 설명을 답변에 추가 할 수 있습니까?
Ryan Gates

1
당신이 것을 사용해야 할 일이면 두 번째는, SQL 서버 2000도 작동
패트릭 Honorez

1
또한 테이블 scheman를 얻을 : SELECT c.name AS COLNAME, t.name AS TABLENAME, SCHEMA_NAME (t.schema_id) AS 스키마 명 ...
Skorunka 프란

327

다음과 같은 구문을 사용할 수도 있습니다.

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

10
이것은 저에게 효과적이며 최고의 대답은 그렇지 않았습니다 (MariaDB를 사용하고 있습니다).
Aubrey Robertson

3
그것은 주어진 모든 다른 데이터베이스에서 작동 놀라운 일이 아니다 INFORMATION_SCHEMA의 부분 ANSI 표준
다 보스

179

SQL 서버 :

SELECT Table_Name, Column_Name 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'YOUR_DATABASE'
AND COLUMN_NAME LIKE '%YOUR_COLUMN%'

신탁:

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
@Todd_ECU 덕분에이 SQL을 정말 자주 복사하여 붙여 넣습니다.
jonaglon

1
이것은 실제로 받아 들여지는 대답이어야합니다. 허용 된 답변보다 훨씬 쉬운 조인을 수행 할 필요가 없습니다
Kolob Canyon

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

여기에서는 필터링 할 where 절에서 추가 조건을 사용하도록 선택하거나 선택하지 않을 수있는 스키마, 테이블 및 열에 대한 약간의 추가 정보를 제공합니다. 예를 들어 값이 있어야하는 필드 만 보려면

and c.is_nullable = 0

다른 조건을 추가 할 수도 있습니다.이 수직 방식으로 select 절에 열을 추가 했으므로 필요에 따라 재정렬, 제거, 이름 바꾸기 또는 다른 항목을 쉽게 추가 할 수있었습니다. 또는 T.Name을 사용하여 테이블 만 검색 할 수 있습니다. 매우 사용자 정의가 가능합니다.

즐겨.


3
d. [max_length] 조금 쓸모없는 것 같습니다. c. [max_length]는 당신이 의도 한 것일 수 있습니다. 하지만 여전히 저를 데려 가서 투표를합니다.
user1566694

검색어 끝에 of "ORDER BY 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 서버 2005로 사용되지 않는)
marc_s

3
잘못된 열 이름 '아이디'
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 2019

안녕하세요, 그러나 스키마 이름으로 sys.objects와 조인 할 필요는 없습니다. Select * from INFORMATION_SCHEMA.COLUMNS를 사용할 수 있습니다. 여기서 COLUMN_NAME LIKE '% MyName %'
user3583912

INFORMATION_SCHEMA.COLUMNS를 지적하는 것이 좋지만 EXEC sp_helptext INFORMATION_SCHEMA.COLUMNS를 실행하면 실제로 동일한 작업을 수행하고 필요하지 않은 많은 쓸모없는 것을 볼 수 있습니다.
K Kimble

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 및 이전 버전에서는 +를 사용하여 문자열을 연결합니다.

이것을 게시 한 후 proc을 약간 다시 포맷했습니다. 지금은 조금 더 발전했지만 훨씬 더 복잡해 보이지만 (프로세스에 있으므로 볼 수는 없습니다) 더 나은 형식입니다.

이 버전을 사용하면 관리 데이터베이스에 넣은 다음 모든 데이터베이스를 검색 할 수 있습니다. 의 decleration 변경 @db에서 'master'중에 기본 데이터베이스 (: 당신이 사용하는 문자열 연결을 2012+에서만 작동이 변경됩니다 않는 한 CONCAT () 함수를 사용하여 참고가되고 싶어요 +사업자).

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 선생님 블로그에서 온 것입니다.


24
SELECT COLUMN_NAME, TABLE_NAME
  FROM INFORMATION_SCHEMA.COLUMNS    
 WHERE COLUMN_NAME LIKE '%myName%'

23

INFORMATION_SCHEMA.COLUMNS에서 column_name 필터로 찾을 수 있습니다.

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 문을 생성하여 내가 찾고있는 값을 검색 할 수있게합니다 (일반적으로 필드 이름이있는 테이블뿐만 아니라 내가 찾고있는 열 이름의 ID와 관련된 정보를 삭제해야합니다.)

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

그런 다음 첫 번째 열 "SQLToRun"을 복사하여 붙여 넣을 수 있습니다. 그런 다음 "Select * from '를'Delete from '으로 바꾸면 해당 ID에 대한 참조를 삭제할 수 있습니다.이 결과를 파일에 쓰십시오. 만일을 대비해

참고 **** delete 문을 실행하기 전에 모든 베이크 업 테이블을 제거하십시오 ...

  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

오라클과 마찬가지로 다음을 사용하여 테이블과 열을 찾을 수 있습니다.

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

귀하의 질문에 대한 답변은 다음과 같습니다

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
작동하지 않았다. 키워드 'key'근처의 구문이 잘못되었습니다.
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'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.