Ottenere un elenco di tabelle e campi in ciascuna in un database


85

Sto cercando di creare un ORM di base (puramente per divertimento) e mi chiedevo, esiste un modo per restituire l'elenco delle tabelle in un database e anche i campi per ogni tabella?

Usando questo, voglio essere in grado di scorrere il set di risultati (in C #) e quindi dire per ogni tabella nel set di risultati, fallo (ad esempio, usa la reflection per creare una classe che farà o conterrà xyz).

Oltre a questo, quali sono alcuni buoni blog in linea per SQL Server? So che questa domanda riguarda davvero l'utilizzo di SP di sistema e database in Sql Server, e sono d'accordo con le domande generali, quindi sono interessato ad alcuni blog che trattano questo tipo di funzionalità.

Grazie


Ri; Elenco blog di SQL Server: dai un'occhiata a questa voce nel mio blog: dbalink.wordpress.com/2009/01/07/…
MarlonRibunal

Vedi la domanda dup correlata: stackoverflow.com/questions/175415/…
Ray

1
Grazie. L'attività può essere eseguita con C #.
GurdeepS

Risposte:


173

E 'questo quello che stai cercando:

Utilizzo delle VISUALIZZAZIONI DEL CATALOGO DI OGGETTI

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

Utilizzo delle VISUALIZZAZIONI DELLO SCHEMA DELLE INFORMAZIONI

  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;

Riferimento: Il mio blog - http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/


7
La prima query restituisce sempre maxlength = 8000 per char, che non è corretto. La seconda query è corretta e più dettagliata
smirkingman

1
entrambe le query restituiscono un numero diverso di righe: /
GorvGoyl

Un vantaggio INFORMATION_SCHEMAdell'approccio è che è abbastanza portabile su diversi database.
j_random_hacker

È un errore di battitura? Userei C.max_length AS Size ,- altrimenti si finirebbe con maxlength = 8000 altrettanto @smirkingman menzionato.
mbx

Trovo che la prima query non elenca gli schemi e restituisce anche troppe righe (duplicati) e la seconda query restituisce il numero corretto di righe. Quindi la seconda query è quella da usare.
Gary Barrett

36

Tavoli:

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

colonne:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

o

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

8
La cosa interessante di INFORMATION_SCHEMA è che è una cosa ISO, non solo una cosa del server sql. Lo stesso codice funzionerà per tutti i database conformi
cindi

È molto utile ... ma come includere il nome del database nell'espressione sopra? Grazie in anticipo ..
Amit Verma

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

12

Ottieni l'elenco di tutte le tabelle e i campi nel database:

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

Ottieni l'elenco di tutti i campi nella tabella:

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

Un vantaggio INFORMATION_SCHEMAdell'approccio è che è abbastanza portabile su diversi database.
j_random_hacker


7

Ho provato alcune soluzioni e l'ho scoperto

Select *
From INFORMATION_SCHEMA.COLUMNS

ti fornisce le informazioni sulla colonna per il tuo database CORRENTE / predefinito.

Select *
From <DBNAME>.INFORMATION_SCHEMA.COLUMNS

, senza <e>, fornisce le informazioni sulla colonna per il database DBNAME.


3

Il tuo altro amico integrato qui è il sistema sproc SP_HELP.

utilizzo del campione:

sp_help <MyTableName>

Restituisce molte più informazioni di quelle di cui hai veramente bisogno, ma almeno il 90% delle tue possibili esigenze sarà soddisfatto.


1

Basta lanciarlo là fuori - facile ora copiare / incollare in una parola o in un documento Google:

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

0

Questo ti porterà tutte le tabelle create dall'utente:

select * from sysobjects where xtype='U'

Per ottenere le colonne:

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

Inoltre, trovo che http://www.sqlservercentral.com/ sia una risorsa db piuttosto buona.


0

Ciò restituirà il nome del database, il nome della tabella, il nome della colonna e il tipo di dati della colonna specificata da un parametro del database:

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

Per tutte le viste , elenca il nome della tabella, il nome della colonna, il tipo di dati e la lunghezza di ogni colonna restituita dalla vista. Questo non risponde alla domanda ma è una domanda chiara.
Ben

0

Ho trovato un modo semplice per recuperare i dettagli di tabelle e colonne di un particolare DB utilizzando lo sviluppatore SQL.

Select *FROM USER_TAB_COLUMNS

0

SELECT * FROM INFORMATION_SCHEMA.COLUMNS dimentica tutto

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNSper ottenere tutti i nomi delle tabelle. Provalo su sqlserver,


0

Per MYSQL:

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

TABLE_SCHEMAnon è il nome del database, è il nome dello schema (cioè dbo). TABLE_CATALOGè il nome del database.
DDuffy

TABLE_SCHEMA: il nome dello schema (database) a cui appartiene la tabella. TABLE_CATALOG: il nome del catalogo a cui appartiene la tabella.
Jyotiranjan

in mysql. non mssql. Non fraintendermi, non sto dicendo che la tua risposta era sbagliata. È corretto, solo non per mssql. Credo che trattino lo schema in modo diverso in entrambi.
DDuffy

-1

in un Microsoft SQL Server puoi usare questo:

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

questo mostra tutte le tabelle e le colonne (e la loro definizione) da tutti i database definiti dall'utente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.