首页 文章

SQL Server查询以获取表中的列列表以及Data types,NOT NULL和PRIMARY KEY约束

提问于
浏览
195

我需要在SQL服务器上编写一个查询来获取特定表中的列列表,其关联的数据类型及其长度以及它们是否为空 . 我设法做了这么多 . 但是现在我还需要针对列进入同一个表 - 如果它是主键,则为TRUE . 我该怎么做呢 ?

这是输出应该是这样的:

Columns_name----Data type----Length----isnull----Pk

请帮我!

15 回答

  • 394

    要避免某些列的重复行,请使用user_type_id而不是system_type_id .

    SELECT 
        c.name 'Column Name',
        t.Name 'Data type',
        c.max_length 'Max Length',
        c.precision ,
        c.scale ,
        c.is_nullable,
        ISNULL(i.is_primary_key, 0) 'Primary Key'
    FROM    
        sys.columns c
    INNER JOIN 
        sys.types t ON c.user_type_id = t.user_type_id
    LEFT OUTER JOIN 
        sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
    LEFT OUTER JOIN 
        sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
    WHERE
        c.object_id = OBJECT_ID('YourTableName')
    

    只需将 YourTableName 替换为您的实际表名 - 适用于SQL Server 2005及更高版本 .

  • 10
    SELECT  
       T.NAME AS [TABLE NAME]
       ,C.NAME AS [COLUMN NAME]
       ,P.NAME AS [DATA TYPE]
       ,P.MAX_LENGTH AS [Max_SIZE]
       ,C.[max_length] AS [ActualSizeUsed]
       ,CAST(P.PRECISION AS VARCHAR) +'/'+ CAST(P.SCALE AS VARCHAR) AS [PRECISION/SCALE]
    FROM SYS.OBJECTS AS T
    JOIN SYS.COLUMNS AS C
        ON T.OBJECT_ID = C.OBJECT_ID
    JOIN SYS.TYPES AS P
        ON C.SYSTEM_TYPE_ID = P.SYSTEM_TYPE_ID
        AND C.[user_type_id] = P.[user_type_id]
    WHERE T.TYPE_DESC='USER_TABLE'
      AND T.name = 'InventoryStatus'
    ORDER BY 2
    
  • 57

    我刚刚制作了marc_s“演示文稿”:

    SELECT 
        c.name 'Column Name',
        t.name 'Data type',
        IIF(t.name = 'nvarchar', c.max_length / 2, c.max_length) 'Max Length',
        c.precision 'Precision',
        c.scale 'Scale',
        IIF(c.is_nullable = 0, 'No', 'Yes') 'Nullable',
        IIF(ISNULL(i.is_primary_key, 0) = 0, 'No', 'Yes') 'Primary Key'
    FROM    
        sys.columns c
    INNER JOIN 
        sys.types t ON c.user_type_id = t.user_type_id
    LEFT OUTER JOIN 
        sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
    LEFT OUTER JOIN 
        sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
    WHERE
        c.object_id = OBJECT_ID('YourTableName')
    
  • 4

    在SQL 2012中,您可以使用:

    EXEC sp_describe_first_result_set N'SELECT * FROM [TableName]'
    

    这将为您提供列名称及其属性 .

  • 8

    扩展Alex的答案,你可以这样做以获得PK约束

    Select C.COLUMN_NAME, C.DATA_TYPE, C.CHARACTER_MAXIMUM_LENGTH, C.NUMERIC_PRECISION, C.IS_NULLABLE, TC.CONSTRAINT_NAME
    From INFORMATION_SCHEMA.COLUMNS As C
        Left Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As TC
          On TC.TABLE_SCHEMA = C.TABLE_SCHEMA
              And TC.TABLE_NAME = C.TABLE_NAME
              And TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
    Where C.TABLE_NAME = 'Table'
    

    我一定错过了你想要一个标志来确定给定列是否是PK的一部分而不是PK约束的名称 . 为此您将使用:

    Select C.COLUMN_NAME, C.DATA_TYPE, C.CHARACTER_MAXIMUM_LENGTH
        , C.NUMERIC_PRECISION, C.NUMERIC_SCALE
        , C.IS_NULLABLE
        , Case When Z.CONSTRAINT_NAME Is Null Then 0 Else 1 End As IsPartOfPrimaryKey
    From INFORMATION_SCHEMA.COLUMNS As C
        Outer Apply (
                    Select CCU.CONSTRAINT_NAME
                    From INFORMATION_SCHEMA.TABLE_CONSTRAINTS As TC
                        Join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU
                            On CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
                    Where TC.TABLE_SCHEMA = C.TABLE_SCHEMA
                        And TC.TABLE_NAME = C.TABLE_NAME
                        And TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
                        And CCU.COLUMN_NAME = C.COLUMN_NAME
                    ) As Z
    Where C.TABLE_NAME = 'Table'
    
  • 73
    SELECT COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM information_schema.columns WHERE table_name = '<name_of_table_or_view>'
    

    在上面的语句中运行 SELECT * 以查看information_schema.columns返回的内容 .

    此问题之前已被回答 - https://stackoverflow.com/a/11268456/6169225

  • 5

    存储过程sp_columns返回详细的表信息 .

    exec sp_columns MyTable
    
  • 2

    查找数据类型和长度的组合结果,并且可以以“NULL”和“非空”的形式为空,使用以下查询 .

    SELECT c.name AS 'Column Name',
           t.name + '(' + cast(c.max_length as varchar(50)) + ')' As 'DataType',
           case 
             WHEN  c.is_nullable = 0 then 'null' else 'not null'
             END AS 'Constraint'
      FROM sys.columns c
      JOIN sys.types t
        ON c.user_type_id = t.user_type_id
     WHERE c.object_id    = Object_id('TableName')
    

    你会发现如下所示的结果 .

    enter image description here

    谢谢 .

  • 0

    您可以使用查询:

    select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, 
           NUMERIC_PRECISION, DATETIME_PRECISION, 
           IS_NULLABLE 
    from INFORMATION_SCHEMA.COLUMNS
    where TABLE_NAME='TableName'
    

    获取除Pk信息之外的所有元数据 .

  • 0

    在查询编辑器中输入表名,然后按Alt F1键,它将显示表的所有信息 .

  • 9
    IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES 
         WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Table')
          BEGIN
            SELECT COLS.COLUMN_NAME, COLS.DATA_TYPE, COLS.CHARACTER_MAXIMUM_LENGTH, 
                  (SELECT 'Yes' FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
                                  ON COLS.TABLE_NAME = TC.TABLE_NAME 
                                 AND TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
                                 AND KCU.TABLE_NAME = TC.TABLE_NAME
                                 AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
                                 AND KCU.COLUMN_NAME = COLS.COLUMN_NAME) AS KeyX
            FROM INFORMATION_SCHEMA.COLUMNS COLS WHERE TABLE_NAME = 'Table' ORDER BY KeyX DESC, COLUMN_NAME
          END
    
  • 3

    为确保获得正确的长度,您需要将unicode类型视为特殊情况 . 见下面的代码 .

    有关详细信息,请参阅:https://msdn.microsoft.com/en-us/library/ms176106.aspx

    SELECT 
       c.name 'Column Name',
       t.name,
       t.name +
       CASE WHEN t.name IN ('char', 'varchar','nchar','nvarchar') THEN '('+
    
                 CASE WHEN c.max_length=-1 THEN 'MAX'
    
                      ELSE CONVERT(VARCHAR(4),
    
                                   CASE WHEN t.name IN ('nchar','nvarchar')
    
                                   THEN  c.max_length/2 ELSE c.max_length END )
    
                      END +')'
    
              WHEN t.name IN ('decimal','numeric')
    
                      THEN '('+ CONVERT(VARCHAR(4),c.precision)+','
    
                              + CONVERT(VARCHAR(4),c.Scale)+')'
    
                      ELSE '' END
    
       as "DDL name",
       c.max_length 'Max Length in Bytes',
       c.precision ,
       c.scale ,
       c.is_nullable,
       ISNULL(i.is_primary_key, 0) 'Primary Key'
    FROM    
       sys.columns c
    INNER JOIN 
       sys.types t ON c.user_type_id = t.user_type_id
    LEFT OUTER JOIN 
       sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
    LEFT OUTER JOIN 
       sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
    WHERE
       c.object_id = OBJECT_ID('YourTableName')
    
  • 0
    select
          c.name as [column name], 
          t.name as [type name],
          tbl.name as [table name]
    from sys.columns c
             inner join sys.types t 
          on c.system_type_id = t.system_type_id 
             inner join sys.tables tbl
          on c.object_id = tbl.object_id
    where
          c.object_id = OBJECT_ID('YourTableName1') 
              and 
          t.name like '%YourSearchDataType%'
    union
    (select
          c.name as [column name], 
          t.name as [type name],
          tbl.name as [table name]
    from sys.columns c
             inner join sys.types t 
          on c.system_type_id = t.system_type_id 
             inner join sys.tables tbl
          on c.object_id = tbl.object_id
    where
          c.object_id = OBJECT_ID('YourTableName2') 
              and 
          t.name like '%YourSearchDataType%')
    union
    (select
          c.name as [column name], 
          t.name as [type name],
          tbl.name as [table name]
    from sys.columns c
             inner join sys.types t 
          on c.system_type_id = t.system_type_id 
             inner join sys.tables tbl
          on c.object_id = tbl.object_id
    where
          c.object_id = OBJECT_ID('YourTableName3') 
              and 
          t.name like '%YourSearchDataType%')
    order by tbl.name
    

    To search which column is in which table based on your search data type for three different table in one database. This query is expandable to 'n' tables.

  • 1

    把另一个答案扔进戒指,这会给你那些专栏和更多:

    SELECT col.TABLE_CATALOG AS [Database]
         , col.TABLE_SCHEMA AS Owner
         , col.TABLE_NAME AS TableName
         , col.COLUMN_NAME AS ColumnName
         , col.ORDINAL_POSITION AS OrdinalPosition
         , col.COLUMN_DEFAULT AS DefaultSetting
         , col.DATA_TYPE AS DataType
         , col.CHARACTER_MAXIMUM_LENGTH AS MaxLength
         , col.DATETIME_PRECISION AS DatePrecision
         , CAST(CASE col.IS_NULLABLE
                    WHEN 'NO' THEN 0
                    ELSE 1
                END AS bit)AS IsNullable
         , COLUMNPROPERTY(OBJECT_ID('[' + col.TABLE_SCHEMA + '].[' + col.TABLE_NAME + ']'), col.COLUMN_NAME, 'IsIdentity')AS IsIdentity
         , COLUMNPROPERTY(OBJECT_ID('[' + col.TABLE_SCHEMA + '].[' + col.TABLE_NAME + ']'), col.COLUMN_NAME, 'IsComputed')AS IsComputed
         , CAST(ISNULL(pk.is_primary_key, 0)AS bit)AS IsPrimaryKey
      FROM INFORMATION_SCHEMA.COLUMNS AS col
           LEFT JOIN(SELECT SCHEMA_NAME(o.schema_id)AS TABLE_SCHEMA
                          , o.name AS TABLE_NAME
                          , c.name AS COLUMN_NAME
                          , i.is_primary_key
                       FROM sys.indexes AS i JOIN sys.index_columns AS ic ON i.object_id = ic.object_id
                                                                         AND i.index_id = ic.index_id
                                             JOIN sys.objects AS o ON i.object_id = o.object_id
                                             LEFT JOIN sys.columns AS c ON ic.object_id = c.object_id
                                                                       AND c.column_id = ic.column_id
                      WHERE i.is_primary_key = 1)AS pk ON col.TABLE_NAME = pk.TABLE_NAME
                                                      AND col.TABLE_SCHEMA = pk.TABLE_SCHEMA
                                                      AND col.COLUMN_NAME = pk.COLUMN_NAME
     WHERE col.TABLE_NAME = 'YourTableName'
       AND col.TABLE_SCHEMA = 'dbo'
     ORDER BY col.TABLE_NAME, col.ORDINAL_POSITION;
    
  • 3

    试试这个:

    select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE 
    from INFORMATION_SCHEMA.COLUMNS IC
    where TABLE_NAME = 'tablename' and COLUMN_NAME = 'columnname'
    

相关问题