Suchen Sie alle Tabellen mit einer Spalte mit dem angegebenen Namen - MS SQL Server

1202

Ist es möglich, nach Tabellennamen abzufragen, die Spalten enthalten

LIKE '%myName%'

?

Gruber
quelle
12
Es gibt ein erstaunliches Plugin für SQL Server, das nach allen Objekttypen suchen kann. SQL-Suche red-gate.com/products/sql-development/sql-search
Vbp
1
@vbp: SQL-Suche ist in der Tat großartig, aber wie viele Tools funktioniert es nicht mit SQL Server 2000 (ja, ich bin im Moment dabei: - /)
Patrick Honorez
2
@vbp ApexSQL Suche nach SSMS bietet noch mehr
Junchen Liu

Antworten:

1849

Suchtabellen:

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;

Suchtabellen & Ansichten:

SELECT      COLUMN_NAME AS 'ColumnName'
            ,TABLE_NAME AS  'TableName'
FROM        INFORMATION_SCHEMA.COLUMNS
WHERE       COLUMN_NAME LIKE '%MyName%'
ORDER BY    TableName
            ,ColumnName;
AdaTheDev
quelle
17
@ INFORMATION_SCHEMA In SQL Server enthaltene frühere Ansichten entsprechen der ISO-Standarddefinition für INFORMATION_SCHEMA. , sys.columns, sys.tablesIst Microsoft SQL Server spezifisch.
Tomasito
4
Die Aufnahme TABLE_SCHEMAin Ihre Auswahlliste kann hilfreich sein. Immer noch +1, weil es eine gute Antwort ist.
Bernhard Hofmann
1
Können Sie Ihrer Antwort die Erklärung der Unterschiede zwischen den beiden hinzufügen, wie von @ user3185569 kommentiert?
Ryan Gates
1
Der zweite funktioniert auch mit SQL Server 2000, wenn Sie das verwenden müssen
Patrick Honorez
1
Holen Sie sich auch einen Tabellenplan: SELECT c.name AS ColName, t.name AS TableName, SCHEMA_NAME (t.schema_id) AS SchemaName ....
Skorunka František
327

Wir können auch die folgende Syntax verwenden: -

select * from INFORMATION_SCHEMA.COLUMNS 
where COLUMN_NAME like '%clientid%' 
order by TABLE_NAME
Khwaza Bandenawaz
quelle
10
Dies hat bei mir funktioniert und die Top-Antwort nicht (ich benutze MariaDB).
Aubrey Robertson
3
Kein Wunder, dass es auf all den verschiedenen Datenbanken funktioniert, INFORMATION_SCHEMAdie Teil des ANSI-Standards sind
Davos,
180

SQL Server:

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

Orakel:

SELECT owner, table_name, column_name 
FROM all_tab_columns 
WHERE column_name LIKE '%YOUR_COLUMN_NAME%'
AND OWNER IN ('YOUR_SCHEMA_NAME');
  • SO EINFACH IST DAS!! (SQL, PL / SQL)
    Ich verwende es die ganze Zeit, um ALLE Instanzen eines Spaltennamens in einer bestimmten Datenbank (Schema) zu finden.
Todd-ECU
quelle
4
Ich kopiere und füge diese SQL wirklich oft ein, danke @Todd_ECU
jonaglon
1
Dies sollte wirklich die akzeptierte Antwort sein. Sie müssen keine Joins durchführen, was es viel einfacher macht als die akzeptierte Antwort
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%'

Hier erhalten Sie einige zusätzliche Informationen zu dem Schema, den Tabellen und Spalten, nach denen Sie möglicherweise zusätzliche Bedingungen in Ihrer where-Klausel zum Filtern verwenden oder nicht. Zum Beispiel, wenn Sie nur die Felder sehen möchten, für die Werte hinzugefügt werden müssen

and c.is_nullable = 0

Sie können auch andere Bedingungen hinzufügen. Ich habe auch die Spalten in der select-Klausel auf diese vertikale Weise hinzugefügt, sodass es einfach war, andere nach Ihren Anforderungen neu anzuordnen, zu entfernen, umzubenennen oder hinzuzufügen. Alternativ können Sie mit T.Name nur nach Tabellen suchen. Es ist sehr anpassbar.

Genießen.

Francis Rodgers
quelle
3
d. [max_length] scheint ein wenig nutzlos zu sein. c. [max_length] ist vielleicht das, was du gemeint hast. Aber ich stimme immer noch dafür, mich dorthin zu bringen.
user1566694
Sie können dies am Ende Ihrer Anfrage setzen 🤫 "ORDER BY t.name"
Fuat
Benutzer aufgepasst. Die obige Abfrage impliziert den Zugriff auf das 'sys'-Objekt, was nicht immer der Fall ist. In meinem Fall hat diese Abfrage beispielsweise nichts zurückgegeben. Stattdessen funktionierte die Verwendung von 'INFORMATION_SCHEMA' wie ein Zauber.
OrizG
85

Das sollte funktionieren:

SELECT name 
FROM sysobjects 
WHERE id IN ( SELECT id 
              FROM syscolumns 
              WHERE name like '%column_name%' )
Cichy
quelle
6
Ich würde sys.tablesanstelle von verwendensysobjects (was ab SQL Server 2005 veraltet ist)
marc_s
3
Ungültiger Spaltenname 'id'
JSON
62

Wenn Sie sich mehr für Tools von Drittanbietern interessieren, gibt es dort viele Optionen, wie zum Beispiel:

Diese sind sehr praktisch, wenn Ihre Datenbank verschlüsselte Objekte (Ansichten, Prozeduren, Funktionen) enthält, da Sie diese mithilfe von Systemtabellen nicht einfach suchen können.

Dwoolk
quelle
46

Ich weiß nicht, warum so viele von Ihnen, die vorschlagen, sich Ihnen anzuschließen sys.table with sys.columns , einfach den folgenden Code verwenden können:

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

oder

Wenn Sie auch einen Schemanamen wünschen:

Select * from  INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME LIKE '%MyName%'
user3583912
quelle
1
Sie erhalten den Schemanamen von sys.tables. Vielleicht ist das kein Problem für Sie, aber für viele Leute.
K Kimble
Hallo, aber es besteht immer noch keine Notwendigkeit, sich mit sys.objects für den Schemanamen zu verbinden. Sie können Select * aus INFORMATION_SCHEMA.COLUMNS verwenden, wobei COLUMN_NAME LIKE '% MyName%'
user3583912
Schön, dass Sie auf INFORMATION_SCHEMA.COLUMNS hinweisen. Wenn Sie jedoch EXEC sp_helptext INFORMATION_SCHEMA.COLUMNS ausführen, können Sie feststellen, dass es tatsächlich dasselbe tut und viele nutzlose andere Dinge, die Sie möglicherweise nicht benötigen.
K Kimble
40

Wenn Sie einfach den Tabellennamen möchten, können Sie Folgendes ausführen:

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

Wenn Sie auch den Schemanamen möchten (was in vielen Fällen der Fall sein wird, da Sie viele verschiedene Schemas haben und wenn Sie sich nicht an jede Tabelle in der Datenbank erinnern können und wo sie hingehört, kann dies nützlich sein), führen Sie Folgendes aus:

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

und schließlich, wenn Sie es in einem schöneren Format haben möchten (obwohl hier der Code (meiner Meinung nach) für das einfache Schreiben zu kompliziert wird):

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

Beachten Sie, dass Sie auch eine Funktion erstellen können, die auf dem basiert, was ich habe:

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

Es ist erwähnenswert, dass die Concat-Funktion 2012 hinzugefügt wurde. Verwenden Sie für 2008r2 und frühere Versionen +, um Zeichenfolgen zu verketten.

Ich habe den Prozess ein wenig neu formatiert, seit ich dies gepostet habe. Es ist jetzt etwas fortgeschrittener, sieht aber viel unordentlicher aus (aber es ist in einem Prozess enthalten, sodass Sie es nie sehen werden) und es ist besser formatiert.

Mit dieser Version können Sie es in einer Verwaltungsdatenbank haben und dann eine beliebige Datenbank durchsuchen. Ändern Sie die Dekleration von @dbvon 'master'in die Standarddatenbank (HINWEIS: Die Verwendung der Funktion CONCAT () funktioniert nur mit 2012+, es sei denn, Sie ändern die Zeichenfolgenverkettung, um die +Operatoren zu verwenden).

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
Ste Bov
quelle
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; 

Es ist von Pinal Sir Blog

Shadab Shah
quelle
24
SELECT COLUMN_NAME, TABLE_NAME
  FROM INFORMATION_SCHEMA.COLUMNS    
 WHERE COLUMN_NAME LIKE '%myName%'
Neil Knight
quelle
23

Sie finden es in INFORMATION_SCHEMA.COLUMNS nach dem Spaltenspaltenfilter

Select DISTINCT TABLE_NAME as TableName,COLUMN_NAME as ColumnName
     From INFORMATION_SCHEMA.COLUMNS Where column_name like '%myname%'
Munavvar
quelle
21
SELECT  [TABLE_NAME] ,
        [INFORMATION_SCHEMA].COLUMNS.COLUMN_NAME
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE '%NAME%' ;
Ritesh Varma-MCA
quelle
17

Die folgende Abfrage gibt Ihnen die genauen Tabellennamen der Datenbank mit dem Feldnamen '% myName'.

SELECT distinct(TABLE_NAME)
  FROM INFORMATION_SCHEMA.COLUMNS    
 WHERE COLUMN_NAME LIKE '%myName%'
Shaikh Farooque
quelle
15

Um vollständige Informationen zu erhalten: Spaltenname, Tabellenname sowie Schema der Tabelle.

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

Ich habe es gerade versucht und das funktioniert perfekt

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;

Ändern Sie YourDatbaseName nur in Ihre Datenbank und YourcolumnName in Ihren Spaltennamen, den Sie für den Rest suchen. Behalten Sie ihn bei.

Hoffe das hat geholfen

Alz
quelle
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
Mauro Bilotti
quelle
7

Ich habe dies für den gleichen Zweck verwendet und es hat funktioniert:

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

Hoffentlich ist dies keine doppelte Antwort, aber ich möchte eine SQL-Anweisung innerhalb einer SQL-Anweisung generieren, mit der ich nach den gesuchten Werten suchen kann (nicht nur nach den Tabellen mit diesen Feldnamen (wie üblich) Ich muss dann alle Informationen löschen, die sich auf die ID des gesuchten Spaltennamens beziehen.

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

Dann kann ich meine erste Spalte "SQLToRun" kopieren und einfügen ... dann ersetze ich "Auswählen * von" durch "Löschen von" und es ermöglicht mir, alle Verweise auf diese angegebene ID zu löschen! Schreiben Sie diese Ergebnisse in eine Datei, damit Sie Habe sie nur für den Fall.

HINWEIS **** Stellen Sie sicher, dass Sie alle Bakup-Tabellen entfernen, bevor Sie Ihre Löschanweisung ausführen ...

  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%'
Dan B.
quelle
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;
PedroSouki
quelle
6

Wie bei Orakel finden Sie hier Tabellen und Spalten:

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

Ich wollte etwas für Tische und Ansichten , das meine Augen nicht bluten ließ.

Abfrage

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]

Ergebnis

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

Um die obigen Antworten zu verbessern, habe ich auch Ansichten aufgenommen und das Schema und die Tabelle / Ansicht zusammengefügt, um die Ergebnisse deutlicher zu machen.

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];
Stephen Brett
quelle
4

Sie können diese Abfrage versuchen:

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%'
Soheila Sadeghian
quelle
1
Sieht sehr ähnlich aus wie blog.sqlauthority.com/2008/08/06/… kann bei der Erklärung helfen, wenn nichts anderes.
user3428422
4

Hier ist die Antwort auf Ihre Frage

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%';
Yogendra
quelle
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
Joby
quelle
Dies war, wonach ich suchte, eine Lösung für JEDE Datenbank, nicht nur für eine.
Fandango68
0

Hier ist eine funktionierende Lösung für eine Sybase-Datenbank

select 
  t.table_name, 
  c.column_name 
from 
  systab as t key join systabcol as c 
where 
   c.column_name = 'MyColumnName'
Janey
quelle
2
Funktioniert nicht. Falsche Syntax in der Nähe des Schlüsselworts 'key'.
Paiman Samadian
0

Wir können sp_columnsfür den Zweck verwenden.

sp_columns 'table name', null, null, '%column name%'
Scheich Abdul Wahid
quelle
0

SQL-Abfrage zum Anzeigen aller Tabellen mit angegebenem Spaltennamen:

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'
Raj
quelle