テーブル内の列の型を返すことができる SQL ステートメントはありますか?
ベストアンサー1
- ISO SQL(つまり今日のほとんどのRDBMS)では、ビューを使用できます
INFORMATION_SCHEMA.COLUMNS
。SQL Serverがサポートする。- このビューの
DATA_TYPE
列には、T-SQL/SQL Server 型名が含まれますが、パラメーター化された型の引数は含まれないため、予期しない/意図しない列の動作が発生する可能性があります。- たとえば、、と入力された 3 つの列がある場合
nvarchar(max)
、datetime2(3)
出力decimal(10,5)
はそれぞれnvarchar
、、、になります。datetime2
decimal
nvarchar
これは、 ((max)
またはなし(123)
)と入力された列であるため問題です。と同じですnvarchar(1)
、 の使用はdecimal
と同じですが、decimal(18,0)
は整数以外の値を格納できません。
- 解決策は、型のパラメータ値を再構築するために、 (の場合)、(およびの場合)、 (および の場合)、および(および の場合)も調べることです。
CHARACTER_OCTET_LENGTH
binary
CHARACTER_MAXIMUM_LENGTH
char
nchar
DATETIME_PRECISION
datetime2
datetimeoffset
NUMERIC_PRECISION
NUMERIC_SCALE
decimal
numeric
- SQL Server は、列でそれぞれおよびによって別名付けられているおよび
float(n)
のみをサポートしているため、 は無視できることに注意してください。float(24)
float(53)
real
float
DATA_TYPE
- SQL Server は、列でそれぞれおよびによって別名付けられているおよび
- たとえば、、と入力された 3 つの列がある場合
- このビューの
WITH q AS (
SELECT
c.TABLE_SCHEMA,
c.TABLE_NAME,
c.ORDINAL_POSITION,
c.COLUMN_NAME,
c.DATA_TYPE,
CASE
WHEN c.DATA_TYPE IN ( N'binary', N'varbinary' ) THEN ( CASE c.CHARACTER_OCTET_LENGTH WHEN -1 THEN N'(max)' ELSE CONCAT( N'(', c.CHARACTER_OCTET_LENGTH , N')' ) END )
WHEN c.DATA_TYPE IN ( N'char', N'varchar', N'nchar', N'nvarchar' ) THEN ( CASE c.CHARACTER_MAXIMUM_LENGTH WHEN -1 THEN N'(max)' ELSE CONCAT( N'(', c.CHARACTER_MAXIMUM_LENGTH, N')' ) END )
WHEN c.DATA_TYPE IN ( N'datetime2', N'datetimeoffset' ) THEN CONCAT( N'(', c.DATETIME_PRECISION, N')' )
WHEN c.DATA_TYPE IN ( N'decimal', N'numeric' ) THEN CONCAT( N'(', c.NUMERIC_PRECISION , N',', c.NUMERIC_SCALE, N')' )
END AS DATA_TYPE_PARAMETER,
CASE c.IS_NULLABLE
WHEN N'NO' THEN N' NOT NULL'
WHEN N'YES' THEN N' NULL'
END AS IS_NULLABLE2
FROM
INFORMATION_SCHEMA.COLUMNS AS c
)
SELECT
q.TABLE_SCHEMA,
q.TABLE_NAME,
q.ORDINAL_POSITION,
q.COLUMN_NAME,
CONCAT( q.DATA_TYPE, ISNULL( q.DATA_TYPE_PARAMETER, N'' ), q.IS_NULLABLE2 ) AS FULL_DATA_TYPE
FROM
q
WHERE
q.TABLE_SCHEMA = 'yourSchemaName' AND
q.TABLE_NAME = 'yourTableName' AND
q.COLUMN_NAME = 'yourColumnName'
ORDER BY
q.TABLE_SCHEMA,
q.TABLE_NAME,
q.ORDINAL_POSITION;
次のような結果になります: