如何获取所有具有标识列的表的列表

问题描述 投票:0回答:6

我想了解如何从 MS SQL 数据库中获取具有标识列的所有表的列表。

sql sql-server t-sql identity-column
6个回答
57
投票
SELECT 
  [schema] = s.name,
  [table] = t.name
FROM sys.schemas AS s
INNER JOIN sys.tables AS t
  ON s.[schema_id] = t.[schema_id]
WHERE EXISTS 
(
  SELECT 1 FROM sys.identity_columns
    WHERE [object_id] = t.[object_id]
);

9
投票

选择本身非常简单,使用 INFORMATION_SCHEMA 视图的 ANSI 系统。 晦涩的部分是

COLUMNPROPERTY
函数。该函数检索与一列关联的一个属性。在本例中,
IsIdentity
属性,它标记列是否使用标识属性

      select COLUMN_NAME, TABLE_NAME
      from INFORMATION_SCHEMA.COLUMNS
       where TABLE_SCHEMA = 'dbo'
       and COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
       order by TABLE_NAME

5
投票

我喜欢这种方法,因为它使用联接而不是 WHERE EXISTS 或对 COLUMNPROPERTY 的调用。请注意,只有在以下情况下才需要分组依据:a) 拥有包含多个 IDENTITY 列的表,并且 b) 不希望出现重复的结果:

SELECT 
    SchemaName = s.name,
    TableName = t.name
FROM
    sys.schemas AS s
    INNER JOIN sys.tables AS t ON s.schema_id = t.schema_id
    INNER JOIN sys.columns AS c ON t.object_id = c.object_id
    INNER JOIN sys.identity_columns AS ic on c.object_id = ic.object_id AND c.column_id = ic.column_id
GROUP BY
    s.name,
    t.name
ORDER BY
    s.name,
    t.name;

1
投票

下面的脚本就可以了:

SELECT a.name as TableName,
  CASE WHEN b.name IS NULL
    THEN 'No Identity Column'
    ELSE b.name
  END as IdentityColumnName
FROM sys.tables a
  LEFT JOIN sys.identity_columns b on a.object_id = b.object_id 

0
投票

旧帖子,我知道,但是..如果您与尝试检查表的数据库位于同一数据库中(就像该线程上的所有其他脚本一样),您可以通过转向某些方法来避免所有显式连接非常有用的功能。如果不需要,请将 DataType 行和 ,* 行注释掉。

 SELECT  SchemaName = OBJECT_SCHEMA_NAME(object_id)
        ,ObjectName = OBJECT_NAME(object_id)
        ,DataType   = TYPE_NAME(system_type_id)
        ,*
   FROM sys.identity_columns
;

-1
投票

选择 OBJECT_NAME(object_Id) Rrom sys.identity_columns 其中 is_identity = 1;

© www.soinside.com 2019 - 2024. All rights reserved.