데이터베이스에서 각각의 테이블 및 필드 목록 가져 오기


84

기본 ORM (순전히 재미를 위해)을 만드는 방법을 찾고 있는데 데이터베이스의 테이블 목록과 모든 테이블의 필드를 반환하는 방법이 있습니까?

이것을 사용하여 결과 집합 (C #)을 반복 한 다음 결과 집합의 각 테이블에 대해 이렇게 말할 수 있기를 원합니다 (예 : 리플렉션을 사용하여 xyz를 수행하거나 포함 할 클래스를 만듭니다).

또한 SQL Server에 대한 좋은 온라인 블로그는 무엇입니까? 이 질문은 실제로 Sql Server에서 시스템 SP와 데이터베이스를 사용하는 것에 관한 것이라는 것을 알고 있으며 일반적인 쿼리에 문제가 없으므로 이러한 종류의 기능을 다루는 블로그에 관심이 있습니다.

감사


레; SQL Server 블로그 목록-내 블로그에서이 항목을 살펴보십시오. dbalink.wordpress.com/2009/01/07/…
MarlonRibunal

관련 dup 질문 참조 : stackoverflow.com/questions/175415/…
Ray

1
감사. 이 작업은 C #으로 수행 할 수 있습니다.
GurdeepS

답변:


172

이것이 당신이 찾고있는 것입니까?

OBJECT CATALOG VIEWS 사용

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

정보 스키마 뷰 사용

  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;

참조 : 내 블로그-http: //dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/


7
첫 번째 쿼리는 char에 대해 항상 maxlength = 8000을 반환하며 이는 올바르지 않습니다. 두 번째 쿼리는 정확하고 상세한입니다
smirkingman

1
두 쿼리 행의 다른 수를 반환 : /
GorvGoyl

INFORMATION_SCHEMA접근 방식 의 한 가지 장점은 서로 다른 데이터베이스간에 이식성이 매우 높다는 것입니다.
j_random_hacker

오타입니까? 나는 사용할 것입니다 C.max_length AS Size ,-그렇지 않으면 @smirkingman이 언급 한 것처럼 maxlength = 8000으로 끝날 것입니다.
mbx

첫 번째 쿼리가 스키마를 나열하지 않고 너무 많은 행 (중복)을 반환하고 두 번째 쿼리가 올바른 행 수를 반환한다는 것을 발견했습니다. 따라서 두 번째 쿼리는 사용할 쿼리입니다.
Gary Barrett

36

테이블 ::

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

열 ::

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

또는

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

8
INFORMATION_SCHEMA의 멋진 점은 SQL 서버가 아니라 ISO에 관한 것입니다. 모든 호환 데이터베이스에 동일한 코드가 작동합니다
cindi

매우 유용하지만 위의 표현식에 데이터베이스 이름을 포함하는 방법은 무엇입니까? 미리 감사드립니다 ..
Amit Verma

@AmitVerma USE <your DB name>; SELECT * FROM INFORMATION_SCHEMA.COLUMNS (최소한 MS SQL 구문)
Chris O

12

데이터베이스의 모든 테이블 및 필드 목록을 가져옵니다.

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

테이블의 모든 필드 목록을 가져옵니다.

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

INFORMATION_SCHEMA접근 방식 의 한 가지 장점은 서로 다른 데이터베이스간에 이식성이 매우 높다는 것입니다.
j_random_hacker


7

몇 가지 솔루션을 테스트 한 결과

Select *
From INFORMATION_SCHEMA.COLUMNS

CURRENT / 기본 데이터베이스에 대한 열 정보를 제공합니다.

Select *
From <DBNAME>.INFORMATION_SCHEMA.COLUMNS

, <및>없이 DBNAME 데이터베이스에 대한 열 정보를 제공합니다.


3

다른 내장 친구는 시스템 sproc SP_HELP입니다.

샘플 사용 ::

sp_help <MyTableName>

실제로 필요한 것보다 훨씬 더 많은 정보를 반환하지만 가능한 요구 사항의 90 % 이상이 충족 될 것입니다.


1

그냥 던져 버리면됩니다-이제 쉽게 복사 / 붙여 넣기를 단어 나 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

MYSQL의 경우 :

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

TABLE_SCHEMA데이터베이스 이름이 아니라 스키마 이름 (예 :) dbo입니다. TABLE_CATALOG데이터베이스 이름입니다.
DDuffy

TABLE_SCHEMA : 테이블이 속한 스키마 (데이터베이스)의 이름입니다. TABLE_CATALOG : 테이블이 속한 카탈로그의 이름입니다.
Jyotiranjan

mysql에서. mssql이 아닙니다. 오해하지 마십시오. 귀하의 대답이 틀렸다고 말하지 마십시오. mssql이 아니라 정확합니다. 나는 그들이 스키마를 두 가지 모두에서 다르게 취급한다고 믿습니다.
DDuffy

0

이렇게하면 사용자가 만든 모든 테이블이 표시됩니다.

select * from sysobjects where xtype='U'

열을 얻으려면 :

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

또한 http://www.sqlservercentral.com/ 이 꽤 좋은 db 리소스라고 생각합니다.


0

그러면 데이터베이스 이름, 테이블 이름, 열 이름 및 데이터베이스 매개 변수에 지정된 열의 데이터 유형이 반환됩니다.

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

모든 에 대해 테이블 ​​이름, 열 이름, 데이터 유형 및 뷰에서 반환 된 모든 열의 길이가 나열됩니다. 이것은 질문에 대한 답은 아니지만 깔끔한 질문입니다.

0

SQL 개발자를 사용하여 특정 DB의 테이블과 열에 대한 세부 정보를 쉽게 가져올 수있는 방법을 찾았습니다.

Select *FROM USER_TAB_COLUMNS

0

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 모든 것을 얻기 위해

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS모든 테이블 이름을 얻으십시오. sqlserver에서 시도해보십시오.


-1

Microsoft SQL Server에서는 다음을 사용할 수 있습니다.

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

모든 사용자 정의 데이터베이스의 모든 테이블과 열 (및 해당 정의)을 보여줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.