Pobieranie listy tabel i pól w każdej z nich w bazie danych

85

Zastanawiam się nad stworzeniem podstawowego ORM (wyłącznie dla zabawy) i zastanawiałem się, czy istnieje sposób na zwrócenie listy tabel w bazie danych, a także pól dla każdej tabeli?

Korzystając z tego, chcę mieć możliwość przechodzenia przez zestaw wyników (w C #), a następnie powiedzieć dla każdej tabeli w zestawie wyników, zrób to (np. Użyj refleksji, aby utworzyć klasę, która będzie zawierać lub zawierać xyz).

Co więcej, jakie są dobre blogi online dotyczące SQL Server? Wiem, że to pytanie tak naprawdę dotyczy używania systemowych SP i baz danych w Sql Server i zgadzam się z ogólnymi zapytaniami, więc jestem zainteresowany niektórymi blogami, które obejmują tego rodzaju funkcje.

Dzięki

GurdeepS
źródło
Re; Lista blogów SQL Server - spójrz na ten wpis na moim blogu: dbalink.wordpress.com/2009/01/07/…
MarlonRibunal
Zobacz powiązane pytanie: stackoverflow.com/questions/175415/…
Ray,
1
Dzięki. Zadanie można wykonać w C #.
GurdeepS,

Odpowiedzi:

173

Czy tego szukasz:

Korzystanie z WIDOKÓW KATALOGU OBIEKTÓW

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

Korzystanie z WIDOKÓW SCHEMATÓW INFORMACJI

  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;

Źródła: My Blog - http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/

MarlonRibunal
źródło
7
Pierwsze zapytanie zawsze zwraca wartość maxlength = 8000 dla znaku, co jest niepoprawne. Drugie pytanie jest poprawne i bardziej szczegółowe
uśmieszek
1
oba zapytania zwracające różną liczbę wierszy: /
GorvGoyl
Jedną z zalet tego INFORMATION_SCHEMApodejścia jest to, że można je przenosić w różnych bazach danych.
j_random_hacker,
Czy to literówka? Użyłbym C.max_length AS Size ,- inaczej chcesz skończyć z MAXLENGTH = 8000 jak @smirkingman wymienione.
mbx
Uważam, że pierwsze zapytanie nie wyświetla schematów, a także zwraca zbyt wiele wierszy (duplikatów), a drugie zapytanie zwraca poprawną liczbę wierszy. Więc drugie zapytanie jest tym, którego należy użyć.
Gary Barrett,
36

Tabele:

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

kolumny:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

lub

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='your_table_name'
ZombieSheep
źródło
8
Fajną rzeczą w INFORMATION_SCHEMA jest to, że jest to kwestia ISO, a nie tylko serwer sql. Ten sam kod będzie działał dla wszystkich zgodnych baz danych
cindi
To bardzo przydatne ... ale jak zawrzeć nazwę bazy danych w powyższym wyrażeniu? Z góry dziękuję ..
Amit Verma
@AmitVerma USE <your DB name>; SELECT * FROM INFORMATION_SCHEMA.COLUMNS (przynajmniej składnia MS SQL)
Chris O
12

Pobierz listę wszystkich tabel i pól w bazie danych:

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

Pobierz listę wszystkich pól w tabeli:

Select *
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_CATALOG Like 'DatabaseName' And TABLE_NAME Like 'TableName' 
ShelS
źródło
Jedną z zalet tego INFORMATION_SCHEMApodejścia jest to, że można je przenosić w różnych bazach danych.
j_random_hacker,
7
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
JeremyDWill
źródło
7

Przetestowałem kilka rozwiązań i stwierdziłem, że

Select *
From INFORMATION_SCHEMA.COLUMNS

podaje informacje o kolumnie dla aktualnej / domyślnej bazy danych.

Select *
From <DBNAME>.INFORMATION_SCHEMA.COLUMNS

, bez <i>, podaje informacje o kolumnie bazy danych DBNAME.

Jie
źródło
3

Twój inny wbudowany przyjaciel to system sproc SP_HELP.

przykładowe użycie:

sp_help <MyTableName>

Zwraca o wiele więcej informacji, niż naprawdę będziesz potrzebować, ale co najmniej 90% Twoich możliwych wymagań zostanie zaspokojonych.

ZombieSheep
źródło
1

Po prostu to wyrzucam - teraz łatwo skopiuj / wklej do słowa lub dokumentu 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>'
Manni Marquesa
źródło
0

W ten sposób otrzymasz wszystkie tabele utworzone przez użytkownika:

select * from sysobjects where xtype='U'

Aby zdobyć cols:

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

Uważam również, że http://www.sqlservercentral.com/ jest całkiem niezłym źródłem bazy danych.

brendan
źródło
0

To zwróci nazwę bazy danych, nazwę tabeli, nazwę kolumny i typ danych kolumny określonej przez parametr bazy danych:

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
Tony Gallone
źródło
W przypadku wszystkich widoków zawiera nazwę tabeli, nazwę kolumny, typ danych i długość każdej kolumny zwróconej przez widok. To nie odpowiada na pytanie, ale jest to zgrabne zapytanie.
Ben
0

Znalazłem łatwy sposób na pobranie szczegółów tabel i kolumn określonej bazy danych za pomocą programisty SQL.

Select *FROM USER_TAB_COLUMNS
Sampath Kumar S.
źródło
0

SELECT * FROM INFORMATION_SCHEMA.COLUMNS zapomnieć wszystko

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNSaby uzyskać całą nazwę tabeli. Wypróbuj na sqlserver,

nafaa jamel
źródło
0

W przypadku MYSQL:

Select *
From INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = "<DatabaseName>"
Jyotiranjan
źródło
TABLE_SCHEMAnie jest nazwą bazy danych, jest to nazwa schematu (tj dbo.). TABLE_CATALOGto nazwa bazy danych.
DDuffy
TABLE_SCHEMA: nazwa schematu (bazy danych), do której należy tabela. TABLE_CATALOG: nazwa katalogu, do którego należy tabela.
Jyotiranjan
w mysql. nie mssql. Nie zrozum mnie źle, nie mówię, że twoja odpowiedź była nieprawidłowa. To jest poprawne, tylko nie dla mssql. Wydaje mi się, że w obu przypadkach traktują schemat inaczej.
DDuffy
-1

w Microsoft SQL Server możesz użyć tego:

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

to pokazuje wszystkie tabele i kolumny (oraz ich definicje) ze wszystkich baz danych zdefiniowanych przez użytkownika.

cjonas
źródło