열 유형을 가져 오는 SQL 문


301

테이블에 열 유형을 반환 할 수있는 SQL 문이 있습니까?


5
RDBMS에 따라 다릅니다. SQL Server에는 sys.syscolumns예를 들어 테이블이 있습니다.
LittleBobbyTables-Au Revoir

3
예, 그러나 사용중인 RDBMS 유형에 따라 다릅니다. SQL은 데이터베이스 제품이 아닌 언어이며이 질문은 특정 제품에 의존합니다. INFORMATION_SCHEMA.COLUMNSRDBMS에있는 경우 표 에서 이러한 종류의 정보를 찾을 수 있습니다.
Bridge

답변:


460

SQL Server 사용 :

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME = 'yourTableName' AND 
     COLUMN_NAME = 'yourColumnName'

11
해당 열 이름을 보지 않으려는 경우에만. 유형 만 반환합니다. 유형이 속하는 열 이름을 보려면 COLUMN_NAME도 선택해야합니다.
HackyStack

5
그리고 테이블이 기본 스키마에 없다면 다음과 같이 조건을 확장 할 수 있습니다.AND TABLE_SCHEMA = 'yourSchema'
luviktor

8
이것은 훌륭하지만 열 유형의 범위를 반환하도록 할 수 있습니까? 즉 varchar(255)대신 varchar하고 int(11)대신 int?
Don Cheadle

13
@mmcrae :의 열 CHARACTER_MAXIMUM_LENGTH을 사용하는 것이 가능합니다 INFORMATION_SCHEMA.COLUMNS. SELECT * FROM INFORMATION_SCHEMA.COLUMNS사용 가능한 모든 열을 보려면를 수행 하십시오.
Francis P

2
임시 테이블은 어떻습니까?
Ilya Gazman

77

TSQL에서 가장 쉬운 방법은 다음과 같습니다.

SELECT COLUMN_NAME, DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'yourTableName'

44

SQL Server의 경우이 시스템 저장 프로시 저는 열 데이터 유형을 포함하여 모든 테이블 정보를 반환합니다.

exec sp_help YOURTABLENAME

5
나는 이것이 정답은 아니지만 귀중한 정보를 제공하기 때문에 공감했다. 예를 들어 Information 스키마에서 찾지 못한 "IsComputed"정보이지만 sp_help 프로 시저 코드에서 찾을 수 있습니다.
Christoph

2
테이블 이름을 선택하고 Alt+F1..을 클릭 하면 동일한 결과가 나타납니다.
Pugal

clarifiy : 편집기에서 테이블 또는 뷰 이름을 선택하고를 누릅니다 Alt+F1. 솔루션 개체 탐색기에 없습니다. 이것은 유용한 기능입니다
bugybunny

18

TSQL / MSSQL에서는 다음과 같습니다.

SELECT t.name, c.name 
FROM sys.tables t 
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types y ON y.user_type_id = c.user_type_id
WHERE t.name = ''

2
실제로 JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id는 고유하지 않습니다. sys.columns 문서
Fabricio

12

오라클 SQL에서는 다음을 수행하십시오.

SELECT
    DATA_TYPE
FROM
    all_tab_columns 
WHERE
    table_name = 'TABLE NAME' -- in uppercase
AND column_name = 'COLUMN NAME' -- in uppercase

9

MySQL을 사용하는 경우 시도해 볼 수 있습니다

SHOW COLUMNS FROM `tbl_name`;

dev.mysql.com의 칼럼 표시

그렇지 않으면 당신은 할 수 있어야합니다

DESCRIBE `tbl_name`;

1
, 그렇지 않으면 다른 RDBMS 떨어져 MySQL의에서 말인가요?
Lamak

2
예. 이 DESCRIBE구문은 Oracle에서도 유효하지만 MsSQL은이 구문을 허용하지 않습니다.
fimas

MSSQL 및 TSQL에 대한 방법은 @jTC의 답변을 참조하십시오.
fimas

최신 버전의 MySQL에는 information_schema.COLUMNS.
Rick James

3 또는 4 열이있는 작은 테이블에 유용한 DESC OR DESCRIBE (사용하는 DBMS에 따라 다름)를 찾은 다음 큰 테이블의 경우 열 이름이 Nullable 플래그 및 열 유형 인 테이블 구조를 표시하지만 결과를 반환하는 데 시간이 더 걸립니다. 필요한 정보를 찾기가 더 어렵습니다.
속도

7

MS SQL을 사용하는 또 다른 변형 :

SELECT TYPE_NAME(system_type_id) 
FROM sys.columns 
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');

4

TSQL / MSSQL 사용

이 쿼리는 테이블 이름, 열 이름, 데이터 유형, 데이터 유형 길이 및 허용 가능한 널을 제공합니다.

SELECT TABLE_NAME,COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'your_table_name'

변경해야 할 유일한 것은 your_table_name입니다.


4

위의 답변을 바탕으로 열을 선언 해야하는 것과 동일한 형식으로 열 데이터 유형을 얻는 것이 종종 유용합니다.

예를 들어, varchar(50), varchar(max), decimal(p, s).

이를 통해 다음을 수행 할 수 있습니다.

SELECT 
  [Name]         = c.[name]
, [Type]         = 
    CASE 
      WHEN tp.[name] IN ('varchar', 'char') THEN tp.[name] + '(' + IIF(c.max_length = -1, 'max', CAST(c.max_length AS VARCHAR(25))) + ')' 
      WHEN tp.[name] IN ('nvarchar','nchar') THEN tp.[name] + '(' + IIF(c.max_length = -1, 'max', CAST(c.max_length / 2 AS VARCHAR(25)))+ ')'      
      WHEN tp.[name] IN ('decimal', 'numeric') THEN tp.[name] + '(' + CAST(c.[precision] AS VARCHAR(25)) + ', ' + CAST(c.[scale] AS VARCHAR(25)) + ')'
      WHEN tp.[name] IN ('datetime2') THEN tp.[name] + '(' + CAST(c.[scale] AS VARCHAR(25)) + ')'
      ELSE tp.[name]
    END
, [RawType]      = tp.[name]
, [MaxLength]    = c.max_length
, [Precision]    = c.[precision]
, [Scale]        = c.scale
FROM sys.tables t 
JOIN sys.schemas s ON t.schema_id = s.schema_id
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types tp ON c.user_type_id = tp.user_type_id
WHERE s.[name] = 'dbo' AND t.[name] = 'MyTable'

1
이것은 받아 들여진 대답이어야합니다. 고마워요, 아마 당신은 조건을 추가 할 수 있습니다 (t.type = 'U')-시스템 테이블 제거
Iannick

VARBINARY 유형은 첫 번째 WHEN줄 에 추가하여 쉽게 제공 할 수 있습니다 .WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
Reverse Engineer

3
USE [YourDatabaseName]
GO

SELECT column_name 'Column Name',
data_type 'Data Type'
FROM information_schema.columns
WHERE table_name = 'YourTableName'
GO

그러면 열 이름과 열 이름 및 해당 열의 데이터 형식 (int, varchar 등)이 표시됩니다.


3

를 들어 IBM DB2 :

SELECT TYPENAME FROM SYSCAT.COLUMNS WHERE TABSCHEMA='your_schema_name' AND TABNAME='your_table_name' AND COLNAME='your_column_name'

2

예를 들어 동적 SQL에서 ALTER COLUMN으로 사용하기 위해 실제 선언 된 데이터 유형을 검색하려면 다음과 같이 사용할 수 있습니다.

SELECT
    TABLE_NAME, 
    COLUMN_NAME,
    DATA_TYPE
        + CASE WHEN DATA_TYPE IN ('char','nchar','varchar','nvarchar','binary','varbinary')
                    AND CHARACTER_MAXIMUM_LENGTH > 0 THEN
                 COALESCE('('+CONVERT(varchar,CHARACTER_MAXIMUM_LENGTH)+')','')
            ELSE '' END
        + CASE WHEN DATA_TYPE IN ('decimal','numeric') THEN
                COALESCE('('+CONVERT(varchar,NUMERIC_PRECISION)+','+CONVERT(varchar,NUMERIC_SCALE)+')','')
            ELSE '' END
        AS Declaration_Type,
    CASE WHEN IS_NULLABLE='NO' THEN 'NOT ' ELSE '' END + 'NULL' AS Nullable
FROM INFORMATION_SCHEMA.COLUMNS
ORDER BY 1,2

1

제 경우에는 Dynamic SQL (Shudder!)에 대한 데이터 유형을 가져와야했습니다. 여기서 전체 데이터 유형을 반환하는 함수가 작성되었습니다. 예를 들어 '소수'를 반환하는 대신 DECIMAL (18,4)을 반환합니다. dbo.GetLiteralDataType


1

TSQL / MSSQL 사용

INTO키워드 를 사용할 수 있습니다 .

SELECT실제 테이블로 의 결과

예: select .... INTO real_table_name

sp_help real_table_name

1

이 쿼리를 사용하여 스키마, 테이블, 열, 유형, max_length, is_nullable을 가져옵니다.

SELECT QUOTENAME(SCHEMA_NAME(tb.[schema_id])) AS 'Schema'
    ,QUOTENAME(OBJECT_NAME(tb.[OBJECT_ID])) AS 'Table'
    ,C.NAME as 'Column'
    ,T.name AS 'Type'
    ,C.max_length
    ,C.is_nullable
FROM SYS.COLUMNS C INNER JOIN SYS.TABLES tb ON tb.[object_id] = C.[object_id]
    INNER JOIN SYS.TYPES T ON C.system_type_id = T.user_type_id
WHERE tb.[is_ms_shipped] = 0
ORDER BY tb.[Name]

1
SHOW COLUMNS FROM //table_name// ;

테이블의 모든 열에 대한 정보를 제공합니다.



0

이 답변에 표시된 Apache Derby의 경우 :

select columndatatype from sys.syscolumns
  where referenceid = (
    select tableid from sys.systables
    where tablename = 'YOUR_TABEL_NAME'
    and columnname= 'YOUR_COLUMN_NAME')

0

vb60에서는 다음을 수행 할 수 있습니다.

Public Cn As ADODB.Connection
'open connection
Dim Rs As ADODB.Recordset
 Set Rs = Cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, UCase("Table"), UCase("field")))

'및 샘플 (valRs는 rs.fields ( "CHARACTER_MAXIMUM_LENGTH"). value에 대한 내 함수)입니다.

 RT_Charactar_Maximum_Length = (ValRS(Rs, "CHARACTER_MAXIMUM_LENGTH"))
        rt_Tipo = (ValRS(Rs, "DATA_TYPE"))

0

일부 사람들은 데이터 형식과 함께 정밀도를 요구하고 있었기 때문에 그런 목적으로 만든 스크립트를 공유하고 싶습니다.

SELECT TABLE_NAME As 'TableName'
       COLUMN_NAME As 'ColumnName'
       CONCAT(DATA_TYPE, '(', COALESCE(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, DATETIME_PRECISION, ''), IIF(NUMERIC_SCALE <> 0, CONCAT(', ', NUMERIC_SCALE), ''), ')', IIF(IS_NULLABLE = 'YES', ', null', ', not null')) As 'ColumnType'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE -- ...
ORDER BY 'TableName', 'ColumnName'

완벽하지는 않지만 대부분의 경우 작동합니다.

사용 Sql-Server


-1

MS SQL의 또 다른 옵션은 select여기에서 쿼리를 유형에 원하는 쿼리 로 바꾸는 것 입니다.

declare @sql varchar(4000);

set @sql = 'select ''hi'' as greeting';

select * from master.sys.dm_exec_describe_first_result_set (@sql, Null, 0);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.