wake-up-neo.com

Finden Sie alle Tabellen, die Spalten mit dem angegebenen Namen enthalten - MS SQL Server

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

LIKE '%myName%'

?

955
gruber

Tabellen durchsuchen:

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;

Suche nach Tabellen und Ansichten:

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

Wir können auch die folgende Syntax verwenden:

select * from INFORMATION_SCHEMA.COLUMNS 
where COLUMN_NAME like '%clientid%' 
order by TABLE_NAME
260
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');
  • SO EINFACH IST DAS!! (SQL, PL/SQL) Ich benutze es ALLEMAL, um ALLE Instanzen eines Spaltennamens in einer gegebenen Datenbank (Schema) zu finden. 
117
Todd ECU

Das sollte funktionieren:

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

Wenn Sie sich eher mit Tools von Drittanbietern beschäftigen, gibt es dort viele Optionen wie:

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

61
Dwoolk
select  
        s.[name]            'Schema',
        t.[name]            'Table',
        c.[name]            'Column',
        d.[name]            'Data Type',
        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 ein paar zusätzliche Informationen über das Schema, die Tabellen und Spalten, für die Sie möglicherweise zusätzliche Bedingungen in der where-Klausel zum Filtern verwenden. Zum Beispiel, wenn Sie nur die Felder sehen möchten, deren Werte hinzugefügt werden müssen

and c.is_nullable = 0

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

Genießen.

48
Francis Rodgers

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

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

Wenn Sie nur den Tabellennamen wünschen, können Sie Folgendes ausführen:

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

Wenn Sie auch den Namen des Schemas wünschen (was in vielen Fällen der Fall ist, 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):

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 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 im Jahr 2012 hinzugefügt wurde. Für 2008r2 und frühere Versionen + zum Verketten von Zeichenfolgen.

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

Mit dieser Version können Sie es in einer Verwaltungsdatenbank speichern und dann eine beliebige Datenbank durchsuchen. Ändern Sie die Deklaration von @db von 'master' in die von Ihnen gewünschte Standarddatenbank (HINWEIS: Die Verwendung der CONCAT () - Funktion funktioniert nur mit 2012+, sofern Sie die Zeichenfolgenverkettung nicht mit den +-Operatoren ändern).

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
38
Ste Bov
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

25
shadab shah

Sie können es von INFORMATION_SCHEMA.COLUMNS über den Spaltennamen-Filter finden 

Select DISTINCT TABLE_NAME as TableName,COLUMN_NAME as ColumnName
     From INFORMATION_SCHEMA.COLUMNS Where column_name like '%myname%'
22
Munavvar
SELECT COLUMN_NAME, TABLE_NAME
  FROM INFORMATION_SCHEMA.COLUMNS    
 WHERE COLUMN_NAME LIKE '%myName%'
20
Neil Knight
SELECT  [TABLE_NAME] ,
        [INFORMATION_SCHEMA].COLUMNS.COLUMN_NAME
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE '%NAME%' ;
20

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

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

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

ich habe es gerade ausprobiert 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 den Rest bei.

Hoffe das hat geholfen

12
Alz
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
8
Mauro Bilotti

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

Ich hoffe, dass dies keine doppelte Antwort ist, aber ich mag es, eine SQL-Anweisung innerhalb einer SQL-Anweisung zu generieren, die es mir ermöglicht, nach den gesuchten Werten zu suchen (nicht nur nach den Tabellen mit diesen Feldnamen (wie gewöhnlich) notwendig, um dann alle Informationen zu 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 das "Select * from" durch "Delete from" und erlaubt mir, alle Verweise auf die angegebene ID zu löschen! Schreiben Sie diese Ergebnisse in die Datei, so dass Sie sie schreiben habe sie nur für den Fall.

HINWEIS **** Stellen Sie sicher, dass Sie alle Bake-Up-Tabellen entfernen, bevor Sie Ihre delete-Anweisung 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%'
6
Dan B
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
PedroSouki

Wie Oracle können Sie Tabellen und Spalten damit finden:

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

Um die obigen Antworten zu verbessern, habe ich auch Views mit einbezogen und das Schema und die Tabelle/View 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];
3
Stephen Brett

Sie können diese Abfrage ausprobieren:

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

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'
0
Janey