列の型を取得するSQL文 質問する

列の型を取得するSQL文 質問する

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

ベストアンサー1

  • ISO SQL(つまり今日のほとんどのRDBMS)では、ビューを使用できますINFORMATION_SCHEMA.COLUMNSSQL Serverがサポートする
    • このビューのDATA_TYPE列には、T-SQL/SQL Server 型名が含まれますが、パラメーター化された型の引数は含まれないため、予期しない/意図しない列の動作が発生する可能性があります。
      • たとえば、、と入力された 3 つの列がある場合nvarchar(max)datetime2(3)出力decimal(10,5)はそれぞれnvarchar、、、になります。 datetime2decimal
        • nvarcharこれは、 ((max)またはなし(123))と入力された列であるため問題です。と同じですnvarchar(1)、 の使用はdecimalと同じですが、decimal(18,0) は整数以外の値を格納できません
      • 解決策は、型のパラメータ値を再構築するために、 (の場合)、(およびの場合)、 (および の場合)、および(および の場合)調べることです。CHARACTER_OCTET_LENGTHbinaryCHARACTER_MAXIMUM_LENGTHcharncharDATETIME_PRECISIONdatetime2datetimeoffsetNUMERIC_PRECISIONNUMERIC_SCALEdecimalnumeric
        • SQL Server は、列でそれぞれおよびによって別名付けられているおよびfloat(n)のみをサポートしているため、 は無視できることに注意してください。float(24)float(53)realfloatDATA_TYPE

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;

次のような結果になります:

ここに画像の説明を入力してください

おすすめ記事