답변:
SQL Server 사용 :
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'yourTableName' AND
COLUMN_NAME = 'yourColumnName'
AND TABLE_SCHEMA = 'yourSchema'
varchar(255)
대신 varchar
하고 int(11)
대신 int
?
CHARACTER_MAXIMUM_LENGTH
을 사용하는 것이 가능합니다 INFORMATION_SCHEMA.COLUMNS
. SELECT * FROM INFORMATION_SCHEMA.COLUMNS
사용 가능한 모든 열을 보려면를 수행 하십시오.
SQL Server의 경우이 시스템 저장 프로시 저는 열 데이터 유형을 포함하여 모든 테이블 정보를 반환합니다.
exec sp_help YOURTABLENAME
Alt+F1
..을 클릭 하면 동일한 결과가 나타납니다.
Alt+F1
. 솔루션 개체 탐색기에 없습니다. 이것은 유용한 기능입니다
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 = ''
JOIN sys.types y ON y.user_type_id = c.user_type_id
system_type_id는 고유하지 않습니다. sys.columns 문서
MySQL을 사용하는 경우 시도해 볼 수 있습니다
SHOW COLUMNS FROM `tbl_name`;
그렇지 않으면 당신은 할 수 있어야합니다
DESCRIBE `tbl_name`;
DESCRIBE
구문은 Oracle에서도 유효하지만 MsSQL은이 구문을 허용하지 않습니다.
information_schema.COLUMNS
.
MS SQL을 사용하는 또 다른 변형 :
SELECT TYPE_NAME(system_type_id)
FROM sys.columns
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');
위의 답변을 바탕으로 열을 선언 해야하는 것과 동일한 형식으로 열 데이터 유형을 얻는 것이 종종 유용합니다.
예를 들어, 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'
WHEN
줄 에 추가하여 쉽게 제공 할 수 있습니다 .WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
예를 들어 동적 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
제 경우에는 Dynamic SQL (Shudder!)에 대한 데이터 유형을 가져와야했습니다. 여기서 전체 데이터 유형을 반환하는 함수가 작성되었습니다. 예를 들어 '소수'를 반환하는 대신 DECIMAL (18,4)을 반환합니다. dbo.GetLiteralDataType
이 쿼리를 사용하여 스키마, 테이블, 열, 유형, 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]
이 답변에 표시된 Apache Derby의 경우 :
select columndatatype from sys.syscolumns
where referenceid = (
select tableid from sys.systables
where tablename = 'YOUR_TABEL_NAME'
and columnname= 'YOUR_COLUMN_NAME')
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"))
일부 사람들은 데이터 형식과 함께 정밀도를 요구하고 있었기 때문에 그런 목적으로 만든 스크립트를 공유하고 싶습니다.
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
sys.syscolumns
예를 들어 테이블이 있습니다.