Belirtilen ada sahip sütun içeren tüm tabloları bulma - MS SQL Server


1202

Sütunları içeren tablo adlarını sorgulamak mümkün mü

LIKE '%myName%'

?


12
Tüm nesne türlerini arayabilen sql sunucusu için inanılmaz bir eklenti var. sql arama red-gate.com/products/sql-development/sql-search
Vbp

1
@vbp: sql-search gerçekten harika, ama birçok araç gibi, SQL Server 2000 ile çalışmıyor (evet, şu anda bununla sıkıştım: - /)
Patrick Honorez

2
SSMS için @vbp ApexSQL araması daha da fazlasını sunuyor
Junchen Liu

Yanıtlar:


1849

Arama Tabloları:

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;

Tablolarda ve Görünümlerde Ara:

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'da bulunan güvenilir görünümler, BİLGİ_SCHEMA için ISO standart tanımına uygundur. , sys.columns, sys.tablesMicrosoft SQL Server özeldir.
Tomasito

4
TABLE_SCHEMASeçim listenize dahil etmek yardımcı olabilir. Hala +1 çünkü iyi bir cevap.
Bernhard Hofmann

1
İkisi arasındaki farkların açıklamasını @ user3185569 tarafından yorumlandığı şekliyle cevabınıza ekleyebilir misiniz?
Ryan Gates

1
İkincisi SQL Server 2000 ile de çalışır, eğer bunu kullanmak zorunda
kalırsanız

1
bir tablo düzenleyicisi de alın: SEL. c.name AS ColName, t.name AS TableName, SCHEMA_NAME (t.schema_id) AS
SchemaName

327

Aşağıdaki sözdizimini de kullanabiliriz: -

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

10
Bu benim için çalıştı ve en iyi cevap olmadı (MariaDB kullanıyorum).
Aubrey Robertson

3
ANSI Standardının birINFORMATION_SCHEMA parçası olarak verilen tüm bu farklı veritabanlarında işe yaraması şaşırtıcı değil
Davos

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');
  • BU KADAR BASİT!! (SQL, PL / SQL)
    Belirli bir veritabanında (şema) bir sütun adının TÜM örneklerini bulmak için TÜM zamanları kullanıyorum.

4
Bu SQL'i sık sık kopyalayıp yapıştırıyorum, teşekkürler @Todd_ECU
jonaglon

1
Bu gerçekten kabul edilen cevap olmalı. Kabul edilen cevaptan daha kolay hale getiren birleştirme yapmanız gerekmez
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%'

Bu, size filtrelemek için yan tümcenizde ek koşulları kullanmayı tercih edebileceğiniz veya seçemeyeceğiniz şema, tablolar ve sütunlar hakkında biraz daha bilgi verecektir. Örneğin, yalnızca değer eklemesi gereken alanları görmek istiyorsanız

and c.is_nullable = 0

Başka şartlar ekleyebilir, ayrıca seçim cümlesindeki sütunları bu dikey şekilde ekledim, böylece ihtiyaçlarınıza göre yeniden sıralamak, kaldırmak, yeniden adlandırmak veya başkalarını eklemek kolaydı. Alternatif olarak T.Name kullanarak sadece tabloları arayabilirsiniz. Çok özelleştirilebilir.

Zevk almak.


3
d. [max_length] biraz işe yaramaz görünüyor. c. [max_length] belki kastettiğiniz şeydir. Ama yine de beni oraya götürmek için oy kullan.
user1566694

Bunu OR "ORDER BY t.name" sorgunuzun sonuna koyabilirsiniz
Fuat

Kullanıcı sakının. Yukarıdaki sorgu her zaman doğru olmayan 'sys' nesnesine erişim anlamına gelir. Benim durumumda örneğin, bu sorgu hiçbir şey döndürmedi. Bunun yerine, 'BİLGİ_SCHEMA'yı kullanmak bir cazibe gibi çalıştı.
OrizG

85

Bu çalışmalı:

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

6
(SQL Server 2005 itibariyle kullanımdan kaldırılmıştır) sys.tablesyerine kullanacağımsysobjects
marc_s

3
Geçersiz sütun adı 'id'
JSON

62

Üçüncü taraf araçlarına daha fazla giriyorsanız, orada birçok seçenek var:

Veritabanınız şifreli nesneler (görünümler, prosedürler, işlevler) içeriyorsa bunlar çok kullanışlıdır, çünkü bunları sistem tablolarını kullanarak kolayca arayamazsınız.


46

Neden bu kadar çoğunuzun sys.table with sys.columns sizinle katılmayı önerdiğini bilmiyorum sadece aşağıdaki kodu kullanabilirsiniz:

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

veya

Şema adını da istiyorsanız:

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

1
Şema adını sys.tables'dan alıyorlar, belki bu sizin için bir sorun değil, ancak birçok insan için.
K Kimble

Merhaba, ancak şema adı için sys.objects ile katılmaya hala gerek yok, COLUMN_NAME LIKE '% MyName%'
user3583912

BİLGİ_SCHEMA.COLUMNS'ı işaret ettiğiniz güzel, ancak EXEC sp_helptext BİLGİ_SCHEMA.COLUMNS'i çalıştırırsanız, aynı şeyi ve gerekmeyebilecek pek çok işe yaramadığını görebilirsiniz.
K Kimble

40

Yalnızca tablo adını istiyorsanız, çalıştırabilirsiniz:

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

Şema Adını da istiyorsanız (birçok durumda, çok farklı şemalara sahip olacağınız ve veritabanındaki her tabloyu ve nereye ait olduğunu hatırlayamıyorsanız) yararlı olabilir:

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

ve son olarak daha güzel bir biçimde istiyorsanız (kodun (bence) kolay yazma için çok karmaşık olmasına rağmen):

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

Ayrıca sahip olduğum şeylere dayalı bir işlev de oluşturabilirsiniz:

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 özelliğinin 2012 yılında eklendiğine dikkat etmek gerekir. 2008r2 ve önceki sürümlerde dizeleri birleştirmek için + kullanın.

Bunu gönderdiğimden beri proc'u biraz yeniden biçimlendirdim. Şimdi biraz daha gelişmiş ama çok daha dağınık görünüyor (ama bir proc'ta, böylece asla görmeyeceksiniz) ve daha iyi biçimlendirilmiş.

Bu sürüm, bir yönetim veritabanında bulunmanıza ve daha sonra herhangi bir veritabanında arama yapmanıza olanak tanır. Ait beyanınıgeçersiz değiştirme @dbdan 'master'hangisi için varsayılan veritabanı (: Kullanmak dize birleştirme 2012+ sadece işi değişecek sürece CONCAT () işlevini kullanarak NOT olmak istiyorum +operatörleri).

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


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

23

Sütun_adı filtresine göre BİLGİ_SCHEMA.COLUMNS adresinden bulabilirsiniz.

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

Aşağıdaki sorgu size '% myName' gibi alan adına sahip veritabanının tam tablo adlarını verecektir.

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

15

Tam bilgi almak için: sütun adı, tablo adı ve tablonun şeması ..

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

13

sadece denedim ve bu mükemmel çalışıyor

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;

Yalnızca YourDatbaseName veritabanınızı ve YourcolumnName sütun adınızı değiştirmek için geri kalanını olduğu gibi tutun.

Umarım bu yardımcı olmuştur


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

Bunu aynı amaçla kullandım ve işe yaradı:

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

6

Umarım bu yinelenen bir cevap değildir, ancak yapmak istediğim bir sql deyimi içinde aradığım değerleri aramamı sağlayacak bir sql deyimi oluşturmaktır (sadece bu alan adlarına sahip tabloları değil (genellikle daha sonra aradığım sütun adının kimliği ile ilgili herhangi bir bilgiyi silmek için gerekli):

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

Sonra kopyalamak ve yapıştırmak çalıştırmak benim 1. sütun "SQLToRun" ... sonra "Seç * gelen 'gelen' Sil 'ile değiştirin ve verilen kimliğe herhangi bir başvuru silmek için izin verir! Bu sonuçları dosyaya yazın böylece size her ihtimale karşı onları.

NOT **** Silme ifadenizi çalıştırmadan önce tüm pişirme tablolarını ortadan kaldırdığınızdan emin olun ...

  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 gibi bununla tablolar ve sütunlar bulabilirsiniz:

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

5

Gözlerimi kanamayan tablolar ve görüntüler için bir şey istedim .

Sorgu

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]

Sonuç

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

4

Sadece yukarıdaki cevaplar üzerinde geliştirmek için ben de Görünümler dahil ve Şema ve Tablo / Görünüm birlikte sonuçları daha belirgin hale birleştirdi.

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

Bu sorguyu deneyebilirsiniz:

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/… 'a çok benziyor başka bir şey yoksa açıklama konusunda yardımcı olabilir.
user3428422

4

İşte sorunuzun cevabı

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

Aradığım şey buydu, HERHANGİ bir veritabanında bir çözüm, sadece bir tane değil.
Fandango68

0

İşte Sybase veritabanı için çalışan bir çözüm

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

2
İşe yaramadı. 'Anahtar' anahtar kelimesinin yanında yanlış sözdizimi.
Paiman Samadian


0

Sütun adı belirtilen tüm tabloları göstermek için SQL sorgusu:

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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.