如何获取在 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.COLUMNS
或sys.columns
和sys.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 内部数据库的不同表中重复的列[重复]的主要内容,如果未能解决你的问题,请参考以下文章