Tìm tất cả các bảng chứa cột có tên được chỉ định - MS SQL Server


1202

Có thể truy vấn tên bảng có chứa cột không

LIKE '%myName%'

?


12
Có một plugin tuyệt vời cho máy chủ sql có thể tìm kiếm tất cả các loại đối tượng. sql tìm kiếm red-gate.com/products/sql-development/sql-search
VBP

1
@vbp: sql-search thực sự tuyệt vời, nhưng giống như nhiều công cụ, nó không hoạt động với SQL Server 2000 (vâng, tôi bị mắc kẹt với điều đó vào lúc này: - /)
Patrick Honorez

2
@vbp ApexQuery tìm kiếm SSMS cung cấp nhiều hơn
Junchen Liu

Câu trả lời:


1851

Bảng tìm kiếm:

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;

Tìm kiếm Bảng & Lượt xem:

SELECT      COLUMN_NAME AS 'ColumnName'
            ,TABLE_NAME AS  'TableName'
FROM        INFORMATION_SCHEMA.COLUMNS
WHERE       COLUMN_NAME LIKE '%MyName%'
ORDER BY    TableName
            ,ColumnName;

17
Các INFORMATION_SCHEMA khung nhìn @Revious có trong SQL Server tuân thủ định nghĩa tiêu chuẩn ISO cho Information_SCHema. , sys.columns, sys.tablesLà Microsoft Sql Server cụ thể.
Tomasito

4
Bao gồm TABLE_SCHEMAtrong danh sách lựa chọn của bạn có thể hữu ích. Vẫn là +1 vì đó là một câu trả lời hay.
Bernhard Hofmann

1
Bạn có thể thêm lời giải thích về sự khác biệt giữa hai câu trả lời của bạn như nhận xét của @ user3185569 không?
Ryan Gates

1
Thứ hai cũng hoạt động với SQL Server 2000, nếu bạn
tình cờ

1
cũng nhận được một scheman bảng: CHỌN c.name AS ColName, t.name AS TableName, SCHema_NAME (t.schema_id) AS SchemaName ....
Skorunka František

327

Chúng tôi cũng có thể sử dụng cú pháp sau: -

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

10
Điều này làm việc cho tôi và câu trả lời hàng đầu đã không (Tôi đang sử dụng MariaDB).
Aubrey Robertson

3
Không có gì đáng ngạc nhiên khi nó hoạt động trên tất cả các cơ sở dữ liệu khác nhau được đưa ra INFORMATION_SCHEMAlà một phần của Tiêu chuẩn ANSI
Davos

181

Máy chủ SQL:

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');
  • ĐƠN GIẢN NHƯ THẾ!! (SQL, PL / SQL)
    Tôi sử dụng nó TẤT CẢ thời gian để tìm TẤT CẢ các phiên bản của một tên cột trong cơ sở dữ liệu (lược đồ) nhất định.

4
Tôi sao chép và dán SQL này thực sự thường xuyên, cảm ơn @Todd_ECU
jonaglon

1
Đây thực sự nên là câu trả lời được chấp nhận. Bạn không phải thực hiện các phép nối dễ dàng hơn nhiều so với câu trả lời được chấp nhận
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%'

Điều này ở đây sẽ cung cấp cho bạn thêm một chút thông tin về lược đồ, bảng và cột mà bạn có thể hoặc không thể chọn sử dụng các điều kiện bổ sung trong mệnh đề where của bạn để lọc. Ví dụ: nếu bạn chỉ muốn xem các trường phải có giá trị thêm

and c.is_nullable = 0

Bạn có thể thêm các điều kiện khác, tôi cũng đã thêm các cột trong mệnh đề select theo cách dọc này để dễ dàng sắp xếp lại, xóa, đổi tên hoặc thêm các cột khác dựa trên nhu cầu của bạn. Thay phiên, bạn có thể tìm kiếm chỉ các bảng bằng cách sử dụng T.Name. Nó rất tùy biến.

Thưởng thức.


3
d. [max_length] có vẻ hơi vô dụng. c. [max_length] có thể là những gì bạn muốn nói. Nhưng vẫn bình chọn để có được tôi ở đó.
dùng1566694

bạn có thể đặt câu hỏi này vào cuối truy vấn của bạn "ĐẶT HÀNG B tNG Tname"
Fuat

Người dùng hãy cẩn thận. Truy vấn trên ngụ ý truy cập vào đối tượng 'sys' không phải lúc nào cũng đúng. Trong trường hợp của tôi ví dụ truy vấn đó không trả về gì. Thay vào đó, sử dụng 'THÔNG TIN_SCHema' hoạt động như một lá bùa.
OrizG

85

Điều này sẽ làm việc:

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

6
Tôi sẽ sử dụng sys.tablesthay vì sysobjects(không dùng nữa trong SQL Server 2005)
marc_s

3
Tên cột 'id' không hợp lệ
JSON

62

Nếu bạn thích dùng các công cụ của bên thứ ba, có rất nhiều tùy chọn như:

Chúng rất hữu ích nếu cơ sở dữ liệu của bạn chứa các đối tượng được mã hóa (dạng xem, thủ tục, hàm) vì bạn không thể dễ dàng tìm kiếm chúng bằng các bảng hệ thống.


46

Tôi không biết tại sao rất nhiều bạn đề nghị Tham gia với sys.table with sys.columns bạn chỉ có thể sử dụng mã dưới đây:

Select object_name(object_id) as TableName,* from SYS.columns where name LIKE '%MyName%'

hoặc là

Nếu bạn muốn tên lược đồ là tốt:

Select * from  INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME LIKE '%MyName%'

1
Họ đang nhận được tên lược đồ từ sys.tables, có thể đó không phải là vấn đề với bạn nhưng nó dành cho rất nhiều người.
K Kimble

Xin chào, nhưng vẫn không cần phải tham gia với sys.objects cho tên lược đồ, bạn có thể sử dụng Chọn * từ THÔNG TIN_SCHema.COLUMNS trong đó COLUMN_NAME THÍCH '% MyName%'
user583912

Rất vui khi bạn chỉ ra Information_SCHema.COLUMNS, tuy nhiên nếu bạn chạy EXEC sp_helptext THÔNG TIN_SCHema.COLUMNS bạn có thể thấy rằng nó thực sự làm điều tương tự, và rất nhiều thứ khác vô dụng mà bạn có thể không cần.
K Kimble

40

Nếu bạn chỉ muốn tên bảng, bạn có thể chạy:

select object_name(object_id) from sys.columns
where name like '%received_at%'

Nếu bạn cũng muốn Tên Schema (trong nhiều trường hợp bạn sẽ làm, vì bạn sẽ có rất nhiều lược đồ khác nhau, và trừ khi bạn có thể nhớ mọi bảng trong cơ sở dữ liệu và nơi nó thuộc về nó có thể hữu ích) chạy:

select OBJECT_SCHEMA_NAME(object_id),object_name(object_id) from sys.columns
where name like '%received_at%'

và cuối cùng nếu bạn muốn nó ở định dạng đẹp hơn (mặc dù đây là nơi mã (theo tôi) đang trở nên quá phức tạp để dễ viết):

select concat(OBJECT_SCHEMA_NAME(object_id),'.',object_name(object_id)) from sys.columns
where name like '%received_at%'

lưu ý bạn cũng có thể tạo một hàm dựa trên những gì tôi có:

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

Điều đáng chú ý là tính năng concat đã được thêm vào năm 2012. Trong năm 2008r2 và trước đó sử dụng + để nối chuỗi.

Tôi đã định dạng lại một chút từ khi tôi đăng bài này. Bây giờ nó đã tiến bộ hơn một chút nhưng trông có vẻ lộn xộn hơn (nhưng nó ở dạng Proc nên bạn sẽ không bao giờ nhìn thấy nó) và nó được định dạng tốt hơn.

Phiên bản này cho phép bạn có nó trong cơ sở dữ liệu quản trị và sau đó tìm kiếm thông qua bất kỳ cơ sở dữ liệu nào. Thay đổi cách giải mã @dbtừ 'master'bất kỳ nơi nào bạn muốn cơ sở dữ liệu mặc định thành (LƯU Ý: sử dụng hàm CONCAT () sẽ chỉ hoạt động với 2012+ trừ khi bạn thay đổi nối chuỗi để sử dụng +toán tử).

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; 

Đó là từ Blog của Pinal Sir


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

23

Bạn có thể tìm thấy nó từ Information_SCHema.COLUMNS bằng bộ lọc cột_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

Truy vấn sau đây sẽ cung cấp cho bạn tên bảng chính xác của cơ sở dữ liệu có tên trường như '% myName'.

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

15

Để có được thông tin đầy đủ: tên cột, tên bảng cũng như lược đồ của bảng ..

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

13

tôi vừa thử nó và nó hoạt động hoàn hảo

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;

Chỉ thay đổi YourDatbaseName thành cơ sở dữ liệu của bạn và YourcolumnName thành tên cột mà bạn đang tìm kiếm phần còn lại giữ nguyên như vậy.

Hy vọng điều này đã giúp


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

Tôi đã sử dụng nó cho cùng một mục đích và nó đã hoạt động:

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

6

Hy vọng rằng đây không phải là một câu trả lời trùng lặp, nhưng điều tôi muốn làm là tạo ra một câu lệnh sql trong câu lệnh sql cho phép tôi tìm kiếm các giá trị mà tôi đang tìm kiếm (không chỉ các bảng có tên trường đó (như thường thấy cần thiết cho tôi để xóa bất kỳ thông tin nào liên quan đến id của tên cột tôi đang tìm):

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

Sau đó, tôi có thể sao chép và dán chạy cột đầu tiên "SQLToRun" ... sau đó tôi thay thế "Chọn * từ 'bằng' Xóa từ 'và nó cho phép tôi xóa mọi tham chiếu đến ID đã cho đó! Viết các kết quả này vào tệp để bạn có chúng chỉ trong trường hợp.

LƯU Ý **** Đảm bảo bạn loại bỏ bất kỳ bảng bakup nào trước khi chạy câu lệnh xóa của bạn ...

  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

Giống như oracle bạn có thể tìm thấy các bảng và cột với điều này:

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

5

Tôi muốn một cái gì đó cho các bảng và các khung nhìn không làm cho mắt tôi bị chảy máu.

Truy vấn

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]

Kết quả

Type        Object   Column
----------------------------
BASE TABLE  Table1   myName1
BASE TABLE  Table2   myName2
VIEW        View1    myName1
VIEW        View2    myName2

4

Chỉ để cải thiện các câu trả lời ở trên, tôi cũng đã bao gồm Lượt xem và Kết hợp Lược đồ và Bảng / Xem cùng nhau làm cho Kết quả rõ ràng hơn.

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

Bạn có thể thử truy vấn này:

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
Trông rất giống với blog.sqlauthority.com/2008/08/06/ trên có thể giúp giải thích nếu không có gì khác.
dùng3428422

4

Đây là câu trả lời cho câu hỏi của bạn

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

Đây là những gì tôi đang tìm kiếm, một giải pháp trên bất kỳ cơ sở dữ liệu nào, không chỉ một.
Fandango68

0

Đây là một giải pháp làm việc cho cơ sở dữ liệu Sybase

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

2
Đã không làm việc. Cú pháp không chính xác gần từ khóa 'key'.
Paiman Samadian


0

Truy vấn SQL để hiển thị tất cả các bảng có tên cột được chỉ định:

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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.