如何获取在 SQL Server 内部数据库的不同表中重复的列[重复]

Posted

技术标签:

【中文标题】如何获取在 SQL Server 内部数据库的不同表中重复的列[重复]【英文标题】:How to get columns that are repeating in different tables in a database inside SQL Server [duplicate] 【发布时间】:2019-10-12 20:59:07 【问题描述】:

我有一个包含大量表的数据库。从这些表中,我想列出出现在多个表中的所有列名及其表名。

我尝试谷歌搜索找到任何合适的文章,可以解释如何实现我在问题部分中描述的结果。

无代码sn-ps

没有错误消息。

【问题讨论】:

如果您搜索,我会很惊讶您一无所获。我建议查看INFORMATION_SCHEMA.COLUMNSsys.columnssys.tables 【参考方案1】:

下面的查询将返回列名及其在当前数据库表中出现的次数:

SELECT c.NAME AS 'ColumnName', COUNT(*) AS Occurences
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
GROUP BY c.NAME
HAVING COUNT(*) > 1

下面的这个查询将有助于确定具体的列名放置在哪些表中:

-- Find column name in all the tables
SELECT c.NAME AS 'ColumnName', t.NAME AS 'TableName'
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.NAME LIKE '%columnname%' -- to be searchable column name
ORDER BY TableName, ColumnName;

【讨论】:

【参考方案2】:

这将返回列名和表名:

select distinct 
TABLE_NAME, 
COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME in(
    select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
    group by COLUMN_NAME
    having count(*) > 1
)
order by TABLE_NAME, COLUMN_NAME

【讨论】:

谢谢@idstam,这个查询适合我的需要。【参考方案3】:

有很多结果和 sn-ps 显示了如何获取数据库中的所有列名。这是对sys.columns 的单个查询,例如:

select Name
from sys.columns

在任何表中返回多次出现的相同 SQL 查询也可以在这里使用,例如:

select Name,count(*)
from sys.columns
group by Name
having count(*)>1

将返回多次出现的列名。

使用COUNT()OVER 可以在不连接的情况下获取列名和表名:

with t as (
    select name,
           object_name(object_id) as TableName,
           count(*) over (partition by name) cnt
    from sys.columns
)
select * 
from t
where cnt >1

【讨论】:

以上是关于如何获取在 SQL Server 内部数据库的不同表中重复的列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 2 个不同的 SQL Server 获取数据

有没有办法获取sql server的内置函数列表?

如何将 Excel 数据从不同的工作表导出到 SQL-SERVER 数据库?

如何使用sql server从excel中获取数据

如何查询数据库文化 (SQL Server 2005)?

为啥 MySQL 和 SQL Server 中的“模式”不同?