Ist es möglich, nach Tabellennamen abzufragen, die Spalten enthalten
LIKE '%myName%'
?
Ist es möglich, nach Tabellennamen abzufragen, die Spalten enthalten
LIKE '%myName%'
?
Antworten:
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;
INFORMATION_SCHEMA
In SQL Server enthaltene frühere Ansichten entsprechen der ISO-Standarddefinition für INFORMATION_SCHEMA. , sys.columns
, sys.tables
Ist Microsoft SQL Server spezifisch.
TABLE_SCHEMA
in Ihre Auswahlliste kann hilfreich sein. Immer noch +1, weil es eine gute Antwort ist.
Wir können auch die folgende Syntax verwenden: -
select * from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME like '%clientid%'
order by TABLE_NAME
INFORMATION_SCHEMA
die Teil des ANSI-Standards sind
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');
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.
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.
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%'
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 @db
von '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
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
SELECT COLUMN_NAME, TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%myName%'
SELECT [TABLE_NAME] ,
[INFORMATION_SCHEMA].COLUMNS.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE '%NAME%' ;
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%'
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
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
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%'
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;
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
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];
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%'
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
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'
Wir können sp_columns
für den Zweck verwenden.
sp_columns 'table name', null, null, '%column name%'