从数据库表中检索主键、标识列和特定名称列

萨米尔·苏利卡诺维奇

我需要从所选数据库中的每个表中获取主键(如果存在)、身份(如果存在)和名为“ID”的列(如果存在)。我得到了 SQL 查询来完成这项工作,但查询返回的记录有时主键同时具有“否”和“是”值。因此,产生了多行数据,所以我使用 DISTINCT 一词来删除重复项。我假设这是由于在某些列上定义了索引。

怎么可能解决这个问题?

使用的 SQL 查询:

SELECT DISTINCT
    object_name(i.object_id) [Table], 
    c.name [Column], 
    IIF(i.is_primary_key = 1, 'Yes', 'No') [PK], 
    IIF(c.is_identity = 1, 'Yes', 'No') [Identity],
    IIF(UPPER(c.name) = 'ID', 'Yes', 'No') [Named ID]
FROM sys.indexes i
    INNER JOIN sys.columns c ON c.object_id = i.object_id
    INNER JOIN sys.identity_columns idc ON idc.object_id = c.object_id AND idc.column_id = c.column_id
WHERE 
    i.is_primary_key = 1 OR c.is_identity = 1 OR c.name = 'ID'
ORDER BY [Table];
萨米尔·苏利卡诺维奇

对于将来需要类似内容的任何人,我采用了 Peter 的答案版本(包括 Sean Lange 使用 sys.tables 的建议):

SELECT 
    t.name AS [Table], 
    c.name AS [Column], 
    CASE i.is_primary_key WHEN 1 THEN 'Yes' ELSE 'No' END [PK], 
    CASE idc.is_identity WHEN 1 THEN 'Yes' ELSE 'No' END [Identity],
    CASE c.name WHEN 'ID' THEN 'Yes' ELSE 'No' END [Named ID]
FROM 
    sys.tables t 
    LEFT JOIN sys.columns c ON c.object_id = t.object_id
    LEFT JOIN sys.identity_columns idc ON idc.object_id = t.object_id AND idc.column_id = c.column_id AND idc.is_identity = 1
    LEFT JOIN sys.index_columns ic ON ic.object_id = t.object_id AND ic.column_id = c.column_id
    LEFT JOIN sys.indexes i ON i.object_id = t.object_id AND i.index_id = ic.index_id AND i.is_primary_key = 1
WHERE t.type = 'U' AND (idc.is_identity = 1 OR i.is_primary_key = 1 OR c.name = 'ID')
ORDER BY t.name, c.name;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从特定数据库中所有表中检索不属于主键和外键的所有列

PHP / MySQL-计算数据库中包含特定名称的表的数量

从sqllite数据库中检索特定行和列的视频uri

如何在数据库中插入主键而不是名称列

基于多个数据库和表的ER图,这些数据库和表从其他表的列值中获取名称

如何在EF Core中获取数据库表主键列的列表

仅在 SQL Server 数据库中向具有主键列的表插入记录

在多数据库解决方案中检索哪些数据库和表包含特定列名

从数据库表的所有标识列中删除[不可复制]

我如何在PostgreSQL中找到包含主键或单个表的特定列的所有数据库表

在R中删除特定名称的列

如何使用 SQL 查找数据库中的特定名称或单词?

数据库表中的状态列

如何从具有时间戳列的数据库表中检索

如何将DataFrame中的特定列插入数据库表的新列中?

选择具有特定表和特定列的所有数据库

尝试通过传递数据库名称以及模式和表名来获取列

无法从数据库检索列的数据

在数据库中创建一个表,将一列定义为主键

如何使用 SQL Server 从数据库中获取具有列的表的特定列中的所有表名和不同值

数据库表主键

从sqlite数据库的列中检索值

在列 SQL 数据库中检索重复值

主键约束,表从本地数据库迁移到雪花,json 列的推荐数据类型?

如何列出特定表中的列具有特定类型的所有数据库?

对多个在列中具有特定名称的列求和

仅将一列,主键和标识插入行到表中

如何将带有标识列的表数据和结构及其值复制到同一数据库中的另一个表(只需更改表名)

如何从Joomla 2.5数据库列,字段名称和值中获取值