列タイプを取得するSQLステートメント


302

テーブルの列のタイプを返すことができるSQLステートメントはありますか?


5
RDBMSに依存します。sys.syscolumnsたとえば、SQL Serverにはテーブルがあります。
LittleBobbyTables-Au Revoir 2012年

3
はい。ただし、使用しているRDBMSのタイプによって異なります。SQLはデータベース製品ではなく言語であり、この質問は特定の製品に依存しています。INFORMATION_SCHEMA.COLUMNSRDBMS に情報がある場合は、このような情報を表で見つけることができます。
ブリッジ

回答:


461

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)代わりにvarcharint(11)代わりにint
Don Cheadle

13
@mmcrae:の列CHARACTER_MAXIMUM_LENGTHを使用できます INFORMATION_SCHEMA.COLUMNS。a SELECT * FROM INFORMATION_SCHEMA.COLUMNSを実行して、使用可能なすべての列を表示します。
フランシスP

2
一時テーブルはどうですか?
Ilya Gazman、2016

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プロシージャコードで見つけてそこからコピーできます。
クリストフ

2
テーブル名を選択してAlt+F1..をクリックすると、同じ結果が得られます。
Pugal

明確にするために:テーブルまたはビューの名前をエディターで選択し、を押す必要がありAlt+F1ます。ソリューションオブジェクトエクスプローラーにはありません。これは
とても

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

Oracle 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
そうでない場合は、あなたが離れてのMySQLから他のRDBMSを意味ですか?
Lamak 2012年

2
はい。DESCRIBE構文はMsSQLがこの構文を受け入れることはありませんが、同様のOracleで有効です。
2012年

MSSQLおよびTSQLのメソッドについては、@ jTCからの回答を参照してください。
12

MySQLの新しいバージョンにはがありますinformation_schema.COLUMNS
Rick James

DESC OR DESCRIBE(使用するDBMSによって異なります)は、3列または4列の小さなテーブルに役立ちます。大きなテーブルの場合、列名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の使用

このクエリは、テーブル名、列名、データ型、データ型の長さ、および許容されるnullを取得します。

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...
逆にエンジニア

3
USE [YourDatabaseName]
GO

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

これは、列の名前とそれらの列のデータ型(int、varcharsなど)を示す値Column Nameを返します。


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

私の場合、動的SQL(Shudder!)のデータ型を取得する必要がありました。とにかく、ここに、完全なデータ型を返す関数を作成しました。たとえば、「10進数」を返す代わりに、DECIMAL(18,4)を返します。dbo.GetLiteralDataType


1

TSQL / MSSQLの使用

INTOキーワードを使用できます。

SELECT実際のTABLEへの結果

例: 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]




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のもう1つのオプションは、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.