我需要查询的帮助,该查询找到包含一组列 (不是一列)的所有表格。
我正在考虑构建存储过程或可以采用逗号分隔的列列表然后返回表名的东西。 最好也应该使用临时表。
我并没有要求你们为我编写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
...
答案 0 :(得分:2)
您可以使用group by
和having
:
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
将列名与逗号分隔列表进行比较,
以及LEN
和REPLACE
的组合,以获取逗号分隔列表中的值数。