Abrufen einer Liste der Tabellen und Felder in jeder Datenbank


83

Ich möchte ein einfaches ORM erstellen (nur zum Spaß) und habe mich gefragt, ob es eine Möglichkeit gibt, die Liste der Tabellen in einer Datenbank und auch die Felder für jede Tabelle zurückzugeben.

Auf diese Weise möchte ich in der Lage sein, die Ergebnismenge (in C #) zu durchlaufen und dann für jede Tabelle in der Ergebnismenge Folgendes zu sagen (z. B. Reflektion verwenden, um eine Klasse zu erstellen, die xyz ausführt oder enthält).

Was sind darüber hinaus einige gute Online-Blogs für SQL Server? Ich weiß, dass es bei dieser Frage wirklich um die Verwendung von System-SPs und -Datenbanken in SQL Server geht, und ich bin mit allgemeinen Fragen einverstanden. Daher interessiere ich mich für einige Blogs, die diese Art von Funktionalität behandeln.

Vielen Dank


Re; SQL Server-Blog-Liste - werfen Sie einen Blick auf diesen Eintrag in meinem Blog: dbalink.wordpress.com/2009/01/07/…
MarlonRibunal

Siehe verwandte Dup-Frage: stackoverflow.com/questions/175415/…
Ray

1
Vielen Dank. Die Aufgabe kann mit C # erledigt werden.
GurdeepS

Antworten:


172

Suchst du danach:

Verwenden von OBJEKTKATALOGANSICHTEN

 SELECT T.name AS Table_Name ,
       C.name AS Column_Name ,
       P.name AS Data_Type ,
       P.max_length AS Size ,
       CAST(P.precision AS VARCHAR) + '/' + CAST(P.scale AS VARCHAR) AS Precision_Scale
FROM   sys.objects AS T
       JOIN sys.columns AS C ON T.object_id = C.object_id
       JOIN sys.types AS P ON C.system_type_id = P.system_type_id
WHERE  T.type_desc = 'USER_TABLE';

Verwenden von INFORMATIONSSCHEMA-ANSICHTEN

  SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS;

Referenz: Mein Blog - http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/


7
Die erste Abfrage gibt immer maxlength = 8000 für char zurück, was falsch ist. Die zweite Abfrage ist korrekt und detaillierter
Grinsender

1
Beide Abfragen geben eine unterschiedliche Anzahl von Zeilen zurück: /
GorvGoyl

Ein Vorteil des INFORMATION_SCHEMAAnsatzes besteht darin, dass er über verschiedene Datenbanken hinweg ziemlich portabel ist.
j_random_hacker

Ist das ein Tippfehler? Ich würde verwenden C.max_length AS Size ,- sonst würden Sie mit maxlength = 8000 enden, genau wie @smirkingman erwähnt.
mbx

Ich finde, dass die erste Abfrage keine Schemas auflistet und auch zu viele Zeilen (Duplikate) zurückgibt und die zweite Abfrage die richtige Anzahl von Zeilen zurückgibt. Die zweite Abfrage ist also die zu verwendende.
Gary Barrett

36

Tabellen ::

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

Säulen ::

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

oder

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='your_table_name'

8
Das Coole an INFORMATION_SCHEMA ist, dass es sich um eine ISO-Sache handelt, nicht nur um eine SQL Server-Sache. Der gleiche Code funktioniert für alle kompatiblen Datenbanken
cindi

Das ist sehr nützlich ... aber wie kann man den Datenbanknamen in den obigen Ausdruck aufnehmen? Vielen Dank im Voraus ..
Amit Verma

@AmitVerma USE <your DB name>; SELECT * FROM INFORMATION_SCHEMA.COLUMNS (mindestens MS SQL-Syntax)
Chris O

12

Liste aller Tabellen und Felder in der Datenbank abrufen:

Select *
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_CATALOG Like 'DatabaseName'

Liste aller Felder in der Tabelle abrufen:

Select *
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_CATALOG Like 'DatabaseName' And TABLE_NAME Like 'TableName' 

Ein Vorteil des INFORMATION_SCHEMAAnsatzes besteht darin, dass er über verschiedene Datenbanken hinweg ziemlich portabel ist.
j_random_hacker


7

Ich habe ein paar Lösungen getestet und festgestellt, dass

Select *
From INFORMATION_SCHEMA.COLUMNS

gibt Ihnen die Spalteninformationen für Ihre AKTUELLE / Standarddatenbank.

Select *
From <DBNAME>.INFORMATION_SCHEMA.COLUMNS

Ohne <und> erhalten Sie die Spalteninformationen für die Datenbank DBNAME.


3

Ihr anderer eingebauter Freund hier ist das System sproc SP_HELP.

Beispielnutzung ::

sp_help <MyTableName>

Es gibt viel mehr Informationen zurück, als Sie wirklich benötigen, aber mindestens 90% Ihrer möglichen Anforderungen werden berücksichtigt.


1

Wirf das einfach raus - einfach in ein Wort oder ein Google-Dokument kopieren / einfügen:

PRINT '<html><body>'
SET NOCOUNT ON
DECLARE @tableName VARCHAR(30)
DECLARE tableCursor CURSOR LOCAL FAST_FORWARD FOR
    SELECT T.name AS TableName 
      FROM sys.objects AS T
     WHERE T.type_desc = 'USER_TABLE'
     ORDER BY T.name
OPEN tableCursor
FETCH NEXT FROM tableCursor INTO @tableName
WHILE @@FETCH_STATUS = 0 BEGIN
    PRINT '<h2>' + @tableName + '</h2>'
    PRINT '<pre>'
    SELECT LEFT(C.name, 30) AS ColumnName,
           LEFT(ISC.DATA_TYPE, 10) AS DataType,
           C.max_length AS Size,
           CAST(P.precision AS VARCHAR(4)) + '/' + CAST(P.scale AS VARCHAR(4)) AS PrecScale,
           CASE WHEN C.is_nullable = 1 THEN 'Null' ELSE 'No Null' END AS [Nullable],
           LEFT(ISNULL(ISC.COLUMN_DEFAULT, ' '), 5)  AS [Default],
           CASE WHEN C.is_identity = 1 THEN 'Identity' ELSE '' END AS [Identity]
    FROM   sys.objects AS T
           JOIN sys.columns AS C ON T.object_id = C.object_id
           JOIN sys.types AS P ON C.system_type_id = P.system_type_id
           JOIN INFORMATION_SCHEMA.COLUMNS AS ISC ON T.name = ISC.TABLE_NAME AND C.name = ISC.COLUMN_NAME
    WHERE  T.type_desc = 'USER_TABLE'
      AND  T.name = @tableName
    ORDER BY T.name, ISC.ORDINAL_POSITION
    PRINT '</pre>'
    FETCH NEXT FROM tableCursor INTO @tableName

END

CLOSE tableCursor
DEALLOCATE tableCursor
SET NOCOUNT OFF
PRINT '</body></html>'

1

Für MYSQL:

Select *
From INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = "<DatabaseName>"

TABLE_SCHEMAist nicht der Datenbankname, sondern der Schemaname (dh dbo). TABLE_CATALOGist der Datenbankname.
DDuffy

TABLE_SCHEMA: Der Name des Schemas (der Datenbank), zu dem die Tabelle gehört. TABLE_CATALOG: Der Name des Katalogs, zu dem die Tabelle gehört.
Jyotiranjan

in MySQL. nicht mssql. Versteh mich nicht falsch, ich sage nicht, dass deine Antwort falsch war. Es ist richtig, nur nicht für mssql. Ich glaube, sie behandeln Schemata in beiden Fällen unterschiedlich.
DDuffy

0

Dadurch erhalten Sie alle vom Benutzer erstellten Tabellen:

select * from sysobjects where xtype='U'

Um die Cols zu bekommen:

Select * from Information_Schema.Columns Where Table_Name = 'Insert Table Name Here'

Außerdem finde ich, dass http://www.sqlservercentral.com/ eine ziemlich gute Datenbankressource ist.


0

Dies gibt den Datenbanknamen, den Tabellennamen, den Spaltennamen und den Datentyp der durch einen Datenbankparameter angegebenen Spalte zurück:

declare @database nvarchar(25)
set @database = ''

SELECT cu.table_catalog,cu.VIEW_SCHEMA, cu.VIEW_NAME, cu.TABLE_NAME,   
cu.COLUMN_NAME,c.DATA_TYPE,c.character_maximum_length
from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE as cu
JOIN INFORMATION_SCHEMA.COLUMNS as c
on cu.TABLE_SCHEMA = c.TABLE_SCHEMA and c.TABLE_CATALOG = 
cu.TABLE_CATALOG
and c.TABLE_NAME = cu.TABLE_NAME
and c.COLUMN_NAME = cu.COLUMN_NAME
where cu.TABLE_CATALOG = @database
order by cu.view_name,c.COLUMN_NAME

Hier werden für alle Ansichten der Tabellenname, der Spaltenname, der Datentyp und die Länge jeder von der Ansicht zurückgegebenen Spalte aufgelistet. Dies beantwortet die Frage nicht, aber es ist eine ordentliche Frage.
Ben vor

0

Ich habe eine einfache Möglichkeit gefunden, die Details von Tabellen und Spalten einer bestimmten Datenbank mit SQL Developer abzurufen.

Select *FROM USER_TAB_COLUMNS

0

SELECT * FROM INFORMATION_SCHEMA.COLUMNS Vergiss alles

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNSum alle Tabellennamen zu erhalten. Probieren Sie es auf SQL Server aus,


-1

In einem Microsoft SQL Server können Sie Folgendes verwenden:

declare @sql2 nvarchar(2000)
        set @sql2  ='
use ?
if (  db_name(db_id()) not in (''master'',''tempdb'',''model'',''msdb'',''SSISDB'')  )
begin   

select
    db_name() as db,
    SS.name as schemaname,
    SO.name tablename,
    SC.name columnname,
    ST.name type,
    case when ST.name in (''nvarchar'', ''nchar'')
        then convert(varchar(10), ( SC.max_length / 2 ))
        when ST.name in (''char'', ''varchar'')
        then convert(varchar(10), SC.max_length)
        else null
    end as length,
    case when SC.is_nullable = 0 then ''No'' when SC.is_nullable = 1 then ''Yes'' else null end as nullable,
    isnull(SC.column_id,0) as col_number
from sys.objects                  SO
join sys.schemas                  SS
    on SS.schema_id = SO.schema_id
join sys.columns             SC
on SO.object_id     = SC.object_id
left join sys.types               ST
    on SC.user_type_id = ST.user_type_id and SC.system_type_id = ST.system_type_id
    where SO.is_ms_shipped = 0 
end
'

exec sp_msforeachdb @command1 = @sql2

Dies zeigt Ihnen alle Tabellen und Spalten (und ihre Definition) aus allen benutzerdefinierten Datenbanken.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.