Temukan semua tabel yang berisi kolom dengan nama yang ditentukan - MS SQL Server


1202

Apakah mungkin untuk menanyakan nama tabel yang berisi kolom

LIKE '%myName%'

?


12
Ada plugin yang luar biasa untuk server sql yang dapat mencari semua jenis objek. sql search red-gate.com/products/sql-development/sql-search
Vbp

1
@vbp: sql-search memang hebat, tetapi seperti banyak alat, itu tidak bekerja dengan SQL Server 2000 (ya, saya terjebak dengan itu saat ini: - /)
Patrick Honorez

2
@vbp ApexSQL mencari SSMS menawarkan lebih banyak lagi
Junchen Liu

Jawaban:


1851

Cari Tabel:

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;

Cari Tabel & Tampilan:

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

17
@Peninjauan sebelumnya yang INFORMATION_SCHEMA disertakan dalam SQL Server mematuhi definisi standar ISO untuk INFORMATION_SCHEMA. , sys.columns, sys.tablesAdalah Microsoft Sql Server tertentu.
Tomasito

4
Termasuk TABLE_SCHEMAdalam daftar pilihan Anda dapat membantu. Masih memberi +1 karena ini adalah jawaban yang bagus.
Bernhard Hofmann

1
Bisakah Anda menambahkan penjelasan tentang perbedaan antara keduanya ke jawaban Anda seperti yang dikomentari oleh @ user3185569?
Ryan Gates

1
Yang kedua juga berfungsi dengan SQL Server 2000, jika Anda harus menggunakannya
Patrick Honorez

1
dapatkan tabel scheman juga: PILIH c.name AS ColName, t.name AS TableName, SCHEMA_NAME (t.schema_id) AS SchemaName ....
Skorunka František

327

Kami juga dapat menggunakan sintaks berikut: -

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

10
Ini bekerja untuk saya dan jawaban teratas tidak (saya menggunakan MariaDB).
Aubrey Robertson

3
Tidak mengherankan itu bekerja pada semua database yang berbeda mengingat itu INFORMATION_SCHEMAadalah bagian dari Standar ANSI
Davos

181

SQL Server:

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

Peramal:

SELECT owner, table_name, column_name 
FROM all_tab_columns 
WHERE column_name LIKE '%YOUR_COLUMN_NAME%'
AND OWNER IN ('YOUR_SCHEMA_NAME');
  • SEDERHANA SEPERTI ITU!! (SQL, PL / SQL)
    Saya menggunakannya SEMUA waktu untuk menemukan SEMUA contoh nama kolom dalam database yang diberikan (skema).

4
Saya menyalin dan menempel SQL ini dengan sangat sering, terima kasih @Todd_ECU
jonaglon

1
Ini benar-benar jawaban yang diterima. Anda tidak harus melakukan penggabungan yang membuatnya lebih mudah daripada jawaban yang diterima
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%'

Ini di sini akan memberi Anda sedikit informasi tambahan tentang skema, tabel dan kolom yang Anda mungkin atau mungkin tidak memilih untuk menggunakan kondisi tambahan di klausa tempat Anda memfilter. Misalnya, jika Anda hanya ingin melihat bidang yang harus memiliki nilai tambah

and c.is_nullable = 0

Anda dapat menambahkan persyaratan lainnya, saya juga menambahkan kolom dalam klausa pilih dengan cara vertikal ini sehingga mudah untuk memesan ulang, menghapus, mengganti nama, atau menambahkan yang lain berdasarkan kebutuhan Anda. Bergantian Anda bisa mencari tabel hanya dengan menggunakan T.Name. Ini sangat bisa dikustomisasi.

Nikmati.


3
d. [max_length] tampaknya sedikit tidak berguna. c. [max_length] mungkin itu yang Anda maksud. Tetapi masih memilih untuk mendapatkan saya di sana.
user1566694

Anda dapat meletakkan ini di akhir permintaan Anda 🤫 "ORDER BY t.name"
Fuat

Hati-hati pengguna. Kueri di atas menyiratkan akses ke objek 'sys' yang tidak selalu benar. Dalam kasus saya misalnya permintaan itu tidak menghasilkan apa-apa. Sebaliknya, menggunakan 'INFORMATION_SCHEMA' bekerja seperti pesona.
OrizG

85

Ini seharusnya bekerja:

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

6
Saya akan menggunakan sys.tablessebagai gantinya sysobjects(yang sudah usang pada SQL Server 2005)
marc_s

3
Nama kolom 'id' tidak valid
JSON

62

Jika Anda lebih ke alat pihak ketiga ada banyak pilihan di sana seperti:

Ini sangat berguna jika database Anda berisi objek terenkripsi (tampilan, prosedur, fungsi) karena Anda tidak dapat dengan mudah mencari ini menggunakan tabel sistem.


46

Saya tidak tahu mengapa begitu banyak dari Anda yang menyarankan Bergabung dengan sys.table with sys.columns Anda cukup menggunakan kode di bawah ini:

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

atau

Jika Anda ingin nama skema juga:

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

1
Mereka mendapatkan nama skema dari sys.tables, mungkin itu bukan masalah bagi Anda tetapi bagi banyak orang.
K Kimble

Hai, tetapi masih tidak perlu bergabung dengan sys.objects untuk nama skema, Anda dapat menggunakan Select * dari INFORMATION_SCHEMA.COLUMNS di mana COLUMN_NAME SUKA '% MyName%'
user3583912

Bagus bahwa Anda menunjukkan INFORMATION_SCHEMA.COLUMNS, namun jika Anda menjalankan EXEC sp_helptext INFORMATION_SCHEMA.COLUMNS Anda dapat melihat bahwa itu memang melakukan hal yang sama, dan banyak hal lain yang tidak berguna yang mungkin tidak Anda perlukan.
K Kimble

40

Jika Anda hanya ingin nama tabel Anda dapat menjalankan:

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

Jika Anda ingin Nama Skema juga (yang dalam banyak kasus Anda akan, karena Anda akan memiliki banyak skema yang berbeda, dan kecuali Anda dapat mengingat setiap tabel dalam database dan di mana tempatnya, ini dapat berguna) jalankan:

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

dan akhirnya jika Anda menginginkannya dalam format yang lebih bagus (walaupun di sinilah kodenya (Menurut saya) menjadi terlalu rumit untuk penulisan yang mudah):

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

perhatikan Anda juga dapat membuat fungsi berdasarkan apa yang saya miliki:

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

Perlu dicatat bahwa fitur concat ditambahkan pada 2012. Untuk 2008r2 dan sebelumnya menggunakan + untuk menggabungkan string.

Saya telah memformat ulang proc sedikit sejak saya memposting ini. Ini sedikit lebih maju sekarang tetapi terlihat jauh lebih berantakan (tapi ada di proc sehingga Anda tidak akan pernah melihatnya) dan diformat lebih baik.

Versi ini memungkinkan Anda untuk memilikinya dalam database administratif dan kemudian mencari melalui database apa pun. Ubah deklerasi dari @dbdari 'master'mana Anda ingin menjadi basis data default (CATATAN: menggunakan fungsi CONCAT () hanya akan bekerja dengan 2012+ kecuali Anda mengubah rangkaian string untuk menggunakan +operator).

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; 

Itu dari Pinal Sir Blog


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

23

Anda dapat menemukannya dari INFORMATION_SCHEMA.COLUMNS oleh filter 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

Permintaan berikut akan memberi Anda nama tabel yang tepat dari database yang memiliki nama bidang seperti '% myName'.

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

15

Untuk mendapatkan informasi lengkap: nama kolom, nama tabel serta skema tabel ..

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

13

Saya baru saja mencobanya dan ini bekerja dengan sempurna

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;

Hanya ubah YourDatbaseName ke database Anda dan YourcolumnName menjadi nama kolom Anda yang Anda cari selebihnya tetap seperti semula.

Semoga ini bisa membantu


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

Saya menggunakan ini untuk tujuan yang sama dan berhasil:

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

6

Semoga ini bukan jawaban duplikat, tapi yang ingin saya lakukan adalah membuat pernyataan sql dalam pernyataan sql yang akan memungkinkan saya untuk mencari nilai yang saya cari (bukan hanya tabel dengan nama bidang tersebut (seperti biasanya diperlukan bagi saya untuk kemudian menghapus semua info yang terkait dengan id dari nama kolom yang saya cari):

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

Lalu saya bisa menyalin dan menempelkan jalankan kolom 1 "SQLToRun" ... lalu saya ganti "Pilih * dari 'dengan' Hapus dari 'dan itu memungkinkan saya untuk menghapus referensi apa pun ke ID yang diberikan! Tuliskan hasil ini ke file sehingga Anda memilikinya untuk berjaga-jaga.

CATATAN **** Pastikan Anda menghilangkan tabel bakup apa pun sebelum menjalankan pernyataan hapus Anda ...

  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

Seperti oracle, Anda dapat menemukan tabel dan kolom dengan ini:

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

5

Saya menginginkan sesuatu untuk tabel dan tampilan yang tidak membuat mata saya berdarah.

Pertanyaan

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]

Hasil

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

4

Hanya untuk meningkatkan jawaban di atas, saya sudah menyertakan Tampilan dan Gabungan Skema dan Tabel / Lihat bersama-sama membuat Hasil lebih jelas.

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

Anda dapat mencoba pertanyaan ini:

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
Terlihat sangat mirip dengan blog.sqlauthority.com/2008/08/06/… dapat membantu dengan penjelasan jika tidak ada yang lain.
user3428422

4

Inilah jawaban untuk pertanyaan Anda

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

Inilah yang saya cari, solusi di seluruh database APAPUN, bukan hanya satu.
Fandango68

0

Inilah solusi yang berfungsi untuk basis data Sybase

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

2
Tidak bekerja. Sintaksis salah di dekat kata kunci 'kunci'.
Paiman Samadian

0

Kita dapat menggunakannya sp_columnsuntuk tujuan tersebut.

sp_columns 'table name', null, null, '%column name%'

0

Permintaan SQL untuk menampilkan semua tabel yang memiliki nama kolom yang ditentukan:

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'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.