sql得到表中的列信息

Posted Sealee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql得到表中的列信息相关的知识,希望对你有一定的参考价值。

取列全部用的 sys. 中的表

CTE:WITH name AS() 用法:   sql树形查询

①主键信息 

SELECT ic.column_id,
       ic.index_column_id,
       ic.object_id
FROM sys.indexes idx
    INNER JOIN sys.index_columns ic
        ON idx.index_id = ic.index_id
           AND idx.object_id = ic.object_id
WHERE idx.object_id = OBJECT_ID(\'Course\')
      AND idx.is_primary_key = 1;

 

 ②改表中的列

SELECT *
FROM sys.columns colm
    INNER JOIN sys.types systype
        ON colm.system_type_id = systype.system_type_id
           AND systype.user_type_id = colm.user_type_id   --这两个条件过滤得到用户创建的列
WHERE colm.object_id = OBJECT_ID(\'Course\'); 

 

 

③最终sql语句:

WITH indexCTE
AS (SELECT ic.column_id,
           ic.index_column_id,
           ic.object_id
    FROM sys.indexes idx
        INNER JOIN sys.index_columns ic
            ON idx.index_id = ic.index_id
               AND idx.object_id = ic.object_id
    WHERE idx.object_id = OBJECT_ID(\'Course\')   --找到该表的主键信息
          AND idx.is_primary_key = 1)
SELECT colm.column_id ColumnID,                 --列id
       CAST(CASE
                WHEN indexCTE.column_id IS NULL THEN
                    0
                ELSE
                    1
            END AS BIT) IsPrimaryKey,
       colm.name ColumnName,                    --列名称
       systype.name ColumnType,                 --列类型
       colm.is_identity IsIdentity,             --是否自增长
       colm.is_nullable IsNullable,             --是否为空
       CAST(colm.max_length AS INT) ByteLength, -- sys.columns中的max_length是字节
       (CASE
            WHEN systype.name = \'nvarchar\'
                 AND colm.max_length > 0 THEN
                colm.max_length / 2
            WHEN systype.name = \'nchar\'
                 AND colm.max_length > 0 THEN
                colm.max_length / 2
            WHEN systype.name = \'ntext\'
                 AND colm.max_length > 0 THEN
                colm.max_length / 2
            ELSE
                colm.max_length
        END
       ) CharLength,                            --得到字符类型长度
       CAST(colm.precision AS INT) Precision,
       CAST(colm.scale AS INT) Scale,
       sep.value Remark  --列描述
FROM sys.columns colm
    INNER JOIN sys.types systype  
        ON colm.system_type_id = systype.system_type_id
           AND systype.user_type_id = colm.user_type_id   --通过两个关联进行过滤得到用户创建的类型
    LEFT JOIN sys.extended_properties sep   
        ON sep.major_id = colm.object_id  --得到是这个表的
           AND colm.column_id = sep.minor_id   --这列的
    LEFT JOIN indexCTE
        ON indexCTE.column_id = colm.column_id
           AND indexCTE.object_id = colm.object_id 
WHERE colm.object_id = OBJECT_ID(\'Course\');

 

以上是关于sql得到表中的列信息的主要内容,如果未能解决你的问题,请参考以下文章