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得到表中的列信息的主要内容,如果未能解决你的问题,请参考以下文章

当没有明确的列可以加入时,如何使用另一个表中的值更新 sql 表?

Oracle SQL:根据在另一个表中给定条件的列中找到的值插入

获取 ajax 请求以更新 SQL 表中的列

您可以从一个表中的列中调用数据以在 SQL 和 Laravel 中的另一个表中使用吗?

Oracle SQL - 重复行并更新表中的列

SQL如何更改表中的列名称?