Nhận danh sách các bảng và trường trong mỗi bảng, trong cơ sở dữ liệu


84

Tôi đang tìm cách tạo ORM cơ bản (hoàn toàn để giải trí) và đang tự hỏi, có cách nào để trả về danh sách các bảng trong cơ sở dữ liệu và cả các trường cho mọi bảng không?

Sử dụng điều này, tôi muốn có thể lặp qua tập kết quả (trong C #) và sau đó nói với mỗi bảng trong tập kết quả, hãy thực hiện điều này (ví dụ: sử dụng phản xạ để tạo một lớp sẽ làm hoặc chứa xyz).

Hơn nữa, một số blog trực tuyến tốt cho SQL Server là gì? Tôi biết câu hỏi này thực sự là về việc sử dụng SP hệ thống và cơ sở dữ liệu trong Sql Server, và tôi đồng ý với các truy vấn chung, vì vậy tôi quan tâm đến một số blog bao gồm loại chức năng này.

Cảm ơn


Re; Danh sách blog SQL Server - hãy xem mục này trong blog của tôi: dbalink.wordpress.com/2009/01/07/…
MarlonRibunal

Xem câu hỏi trùng lặp liên quan: stackoverflow.com/questions/175415/…
Ray

1
Cảm ơn. Nhiệm vụ có thể được thực hiện với C #.
GurdeepS

Câu trả lời:


172

Đây có phải là những gì bạn đang tìm kiếm:

Sử dụng CHẾ ĐỘ XEM DANH MỤC ĐỐI TƯỢNG

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

Sử dụng CHẾ ĐỘ XEM LỊCH TRÌNH THÔNG TIN

  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;

Tham khảo: Blog của tôi - http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/


7
Truy vấn đầu tiên luôn trả về maxlength = 8000 cho char, điều này không chính xác. Các truy vấn thứ hai là chính xác và chi tiết hơn
smirkingman

1
cả hai truy vấn trả về số lượng hàng khác nhau: /
GorvGoyl

Một ưu điểm của INFORMATION_SCHEMAphương pháp này là nó khá linh hoạt trên các cơ sở dữ liệu khác nhau.
j_random_hacker

Đó có phải là lỗi đánh máy không? Tôi sẽ sử dụng C.max_length AS Size ,- nếu không, bạn sẽ kết thúc với maxlength = 8000 giống như @smirkingman đã đề cập.
mbx

Tôi thấy truy vấn đầu tiên không liệt kê các lược đồ và cũng trả về quá nhiều hàng (trùng lặp) và truy vấn thứ 2 đang trả về số hàng chính xác. Vì vậy, truy vấn thứ 2 là truy vấn để sử dụng.
Gary Barrett

36

Những cái bàn ::

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

cột ::

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

hoặc là

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

8
Điều thú vị về INFORMATION_SCHEMA là nó là một thứ ISO, không chỉ là một thứ máy chủ sql. Mã tương tự sẽ hoạt động cho tất cả các cơ sở dữ liệu tuân thủ
cindi

Điều đó rất hữu ích ... nhưng làm thế nào để bao gồm tên cơ sở dữ liệu trong biểu thức trên? Cảm ơn trước ..
Amit Verma

@AmitVerma USE <your DB name>; SELECT * FROM INFORMATION_SCHEMA.COLUMNS (ít nhất là cú pháp MS SQL)
Chris O

12

Nhận danh sách tất cả các bảng và các trường trong cơ sở dữ liệu:

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

Nhận danh sách tất cả các trường trong bảng:

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

Một ưu điểm của INFORMATION_SCHEMAphương pháp này là nó khá linh hoạt trên các cơ sở dữ liệu khác nhau.
j_random_hacker


7

Tôi đã thử nghiệm một số giải pháp và nhận thấy rằng

Select *
From INFORMATION_SCHEMA.COLUMNS

cung cấp cho bạn thông tin cột cho cơ sở dữ liệu CURRENT / mặc định của bạn.

Select *
From <DBNAME>.INFORMATION_SCHEMA.COLUMNS

, không có <và>, cung cấp cho bạn thông tin cột cho cơ sở dữ liệu DBNAME.


3

Người bạn sẵn có khác của bạn ở đây là hệ thống SP_HELP.

sử dụng mẫu ::

sp_help <MyTableName>

Nó trả về nhiều thông tin hơn bạn thực sự cần, nhưng ít nhất 90% yêu cầu có thể của bạn sẽ được đáp ứng.


1

Chỉ cần ném nó ra khỏi đó - bây giờ dễ dàng sao chép / dán vào một từ hoặc tài liệu 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>'

1

Đối với MYSQL:

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

TABLE_SCHEMAkhông phải là tên cơ sở dữ liệu, nó là tên Lược đồ (tức là dbo). TABLE_CATALOGlà tên cơ sở dữ liệu.
DDuffy

TABLE_SCHEMA: Tên của lược đồ (cơ sở dữ liệu) mà bảng thuộc về. TABLE_CATALOG: Tên của danh mục chứa bảng.
Jyotiranjan

trong mysql. không phải mssql. Đừng hiểu sai ý tôi, tôi không nói câu trả lời của bạn không chính xác. Nó là chính xác, chỉ không cho mssql. Tôi tin rằng họ xử lý lược đồ khác nhau trong cả hai.
DDuffy

0

Điều này sẽ giúp bạn nhận được tất cả các bảng do người dùng tạo:

select * from sysobjects where xtype='U'

Để lấy cols:

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

Ngoài ra, tôi thấy http://www.sqlservercentral.com/ là một nguồn tài nguyên db khá tốt.


0

Thao tác này sẽ trả về tên cơ sở dữ liệu, tên bảng, tên cột và kiểu dữ liệu của cột được chỉ định bởi tham số cơ sở dữ liệu:

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

Đối với tất cả Chế độ xem , phần này liệt kê tên bảng, tên cột, kiểu dữ liệu và độ dài của mọi cột được chế độ xem trả về. Điều này không trả lời câu hỏi nhưng nó là một truy vấn gọn gàng.
Ben

0

Tôi đã tìm thấy một cách dễ dàng để tìm nạp chi tiết của Bảng và cột của một DB cụ thể bằng cách sử dụng nhà phát triển SQL.

Select *FROM USER_TAB_COLUMNS

0

SELECT * FROM INFORMATION_SCHEMA.COLUMNS quên tất cả

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNSđể lấy tất cả tên bảng. Hãy thử nó trên sqlserver,


-1

trong Microsoft SQL Server, bạn có thể sử dụng cái này:

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

điều này hiển thị cho bạn tất cả các bảng và cột (và định nghĩa của chúng) từ tất cả các cơ sở dữ liệu do người dùng xác định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.