SQL Server:返回一组数据库表共享的列列表
我继承了一个我们希望自动化的大型报告。我相信大部分数据都在数据仓库中,我可以通过SQL Server访问这些数据。我的问题是,我没有很多文档数据字典、模式等,我想确定几个表中哪些字段是公共的。通常,当我想要返回表和列的列表时,我会查询信息模式。但是,在本例中,我基本上是在寻找一个类似以下内容的查询:SQL Server:返回一组数据库表共享的列列表,sql,sql-server,Sql,Sql Server,我继承了一个我们希望自动化的大型报告。我相信大部分数据都在数据仓库中,我可以通过SQL Server访问这些数据。我的问题是,我没有很多文档数据字典、模式等,我想确定几个表中哪些字段是公共的。通常,当我想要返回表和列的列表时,我会查询信息模式。但是,在本例中,我基本上是在寻找一个类似以下内容的查询: select table_name, column_name from (information_schema, others?) where table_name like 'T_Blah %'
select table_name, column_name
from (information_schema, others?)
where table_name like 'T_Blah %'
and column_names are equal
我意识到我可以通过对象浏览器实现这一点,但一旦我开始进入更多的表,我希望使用一种基于查询的快速方法来识别要加入的字段
我很感激能得到的任何帮助。我在谷歌上搜索了一会儿,但没有找到解决方案,或者我没有意识到我已经找到了解决方案。如果我理解正确,您可以尝试以下方法:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
SELECT TABLE_NAME, COLUMN_NAME
FROM ( SELECT *, COUNT(*) OVER(PARTITION BY COLUMN_NAME) Quant
FROM INFORMATION_SCHEMA.COLUMNS) A
WHERE TABLE_NAME LIKE 'T_Blah%' AND Quant > 1
ORDER BY COLUMN_NAME, TABLE_NAME
这应该适用于sql server。这只是我手头的一个问题,所以比你要求的要多一些。但是,我保留了它,以防你需要额外的信息:。如果没有,就把它取下来
select distinct columns.name, schemas.name + '.' + tables.name
from sys.columns
join sys.tables
on tables.object_id = columns.object_id
join sys.schemas
on schemas.schema_id = tables.schema_id
where tables.name like '%blah%'
order by columns.name, schemas.name + '.' + tables.name
除了信息模式之外,您还有系统表syscolumns。假设您使用前一种方法,类似这样的方法应该会起作用:
select column_name, count(distinct table_name)
from information_schema.columns
group by column_name
having count(distinct table_name) > 1
显然,如果要查看子集,可以通过表名/模式进行限制,这将在指定表中生成列名和数据类型,这些列名和数据类型也会出现在其他表中,后面是以逗号分隔的表列表,这些列名和数据类型会出现在这些表中:
SELECT COLUMN_NAME, DATA_TYPE, REPLACE(REPLACE(REPLACE(
(SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (COLUMN_NAME = CommonColumns.COLUMN_NAME) AND (DATA_TYPE = CommonColumns.DATA_TYPE)
FOR XML PATH(''))
, '</TABLE_NAME><TABLE_NAME>', ', '), '<TABLE_NAME>', ''), '</TABLE_NAME>', '')
AS Tables
FROM (SELECT DISTINCT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE 'T_Blah%') AS CommonColumns
WHERE (SELECT COUNT(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (COLUMN_NAME = CommonColumns.COLUMN_NAME) AND (DATA_TYPE = CommonColumns.DATA_TYPE)) > 1
要通过外键获取关系,请使用:
SELECT sys.foreign_keys.name AS ForeignKeyName, OBJECT_NAME(sys.foreign_key_columns.parent_object_id) AS ForeignKeyTableName,
ForeignKeyColumns.name AS ForeignKeyColumnName, OBJECT_NAME(sys.foreign_key_columns.referenced_object_id) AS ReferencedTableName,
ReferencedColumns.name AS ReferencedColumnName
FROM sys.foreign_keys INNER JOIN
sys.foreign_key_columns ON sys.foreign_keys.object_id = sys.foreign_key_columns.constraint_object_id INNER JOIN
sys.columns AS ForeignKeyColumns ON sys.foreign_key_columns.parent_object_id = ForeignKeyColumns.object_id AND
sys.foreign_key_columns.parent_column_id = ForeignKeyColumns.column_id INNER JOIN
sys.columns AS ReferencedColumns ON sys.foreign_key_columns.referenced_object_id = ReferencedColumns.object_id AND
sys.foreign_key_columns.referenced_column_id = ReferencedColumns.column_id
WHERE (OBJECT_NAME(sys.foreign_key_columns.parent_object_id) LIKE 'T_Blah%') OR (OBJECT_NAME(sys.foreign_key_columns.referenced_object_id)
LIKE 'T_Blah%')
我建议不要使用信息模式——原因如下:是否有理由假定列名相等?外键很少有相同的名称,例如。。。在我的桌子上。person\u id=person.id谢谢,在我稍微调整了一下之后,它似乎起了作用。我真的只关心出现在多个表中的列,所以这部分地让我达到了目的。以下内容仅返回出现在多个表中的列的表和列列表:Oops select table_name,信息模式中的列名称。信息模式中的列名称。信息模式中的列名称。信息模式中的列名称。表名称如“T_Blah”的列名称按列名称分组,表名称如“T_Blah”>1和表名称如“T_Blah”@Jeremy我相信这个答案应该涵盖您想要的几乎所有内容。谢谢。这看起来比我所用的更加雄辩和彻底,尽管我同意上面的另一种方法也让我达到了目的。非常感谢!
SELECT sys.foreign_keys.name AS ForeignKeyName, OBJECT_NAME(sys.foreign_key_columns.parent_object_id) AS ForeignKeyTableName,
ForeignKeyColumns.name AS ForeignKeyColumnName, OBJECT_NAME(sys.foreign_key_columns.referenced_object_id) AS ReferencedTableName,
ReferencedColumns.name AS ReferencedColumnName
FROM sys.foreign_keys INNER JOIN
sys.foreign_key_columns ON sys.foreign_keys.object_id = sys.foreign_key_columns.constraint_object_id INNER JOIN
sys.columns AS ForeignKeyColumns ON sys.foreign_key_columns.parent_object_id = ForeignKeyColumns.object_id AND
sys.foreign_key_columns.parent_column_id = ForeignKeyColumns.column_id INNER JOIN
sys.columns AS ReferencedColumns ON sys.foreign_key_columns.referenced_object_id = ReferencedColumns.object_id AND
sys.foreign_key_columns.referenced_column_id = ReferencedColumns.column_id
WHERE (OBJECT_NAME(sys.foreign_key_columns.parent_object_id) LIKE 'T_Blah%') OR (OBJECT_NAME(sys.foreign_key_columns.referenced_object_id)
LIKE 'T_Blah%')