查找包含一组列的所有表

时间:2018-03-12 11:09:13

标签: sql sql-server tsql

我需要查询的帮助,该查询找到包含一组列 (不是一列)的所有表格

我正在考虑构建存储过程或可以采用逗号分隔的列列表然后返回表名的东西。 最好也应该使用临时表。

我并没有要求你们为我编写SP,只是给我一个提示,告诉我要做什么来查找包含列列表而不是列的列表。

这样的东西
EXEC GetAllTablesContainingColumns 'ColA, ColB, ColC' 

我考虑过修改以下内容

SELECT c.SCHEMA_NAME, c.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.COLUMN_NAME = @columnname

但并不真正知道如何包含多个值,而不是

SELECT c.SCHEMA_NAME, c.TABLE_NAME
    FROM INFORMATION_SCHEMA.COLUMNS c
    WHERE c.COLUMN_NAME = @columnname1
      AND c.COLUMN_NAME = @columnname2
      AND c.COLUMN_NAME = @columnname3
      AND c.COLUMN_NAME = @columnname4
      ...

2 个答案:

答案 0 :(得分:2)

您可以使用group byhaving

SELECT c.SCHEMA_NAME, c.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.COLUMN_NAME IN (@columnname1, @columnname2, @columnname3, @columnname4)
GROUP BY c.SCHEMA_NAME, c.TABLE_NAME
HAVING COUNT(*) = 4;  -- the number of columns in the list

如果你想让它变得更有活力:

with cc as (
      select *
      from (values ((@columnname1), (@columnname2), (@columnname3), (@columnname4)) v(col)
     )
select cc.schema_name, cc.table_name
from information_schema.columns c join
     cc
     on c.column_name = cc.col
group by cc.schema_name, cc.table_name
having count(*) = (select count(*) from cc);

答案 1 :(得分:1)

至少可以建议不要在数据库中使用分隔值。 如果您坚持使用逗号分隔的字符串作为参数,则可以执行以下操作:

CREATE PROCEDURE GetTablesWithColumns
(
    @CommaDelimitedListOfColumns varchar(8000)
)

AS

SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE ','+ @CommaDelimitedListOfColumns +',' LIKE '%,'+ COLUMN_NAME +',%'
GROUP BY TABLE_SCHEMA, TABLE_NAME
HAVING COUNT(*) = LEN(@CommaDelimitedListOfColumns) - 
                  LEN(REPLACE(@CommaDelimitedListOfColumns, ',', '')) + 1

GO

使用LIKE将列名与逗号分隔列表进行比较, 以及LENREPLACE的组合,以获取逗号分隔列表中的值数。

You can see a live demo on rextester.