如何根据一组列名获取数据库对象列表?

时间:2017-12-16 01:50:07

标签: sql sql-server-2012

我根据某些标准测试数据库对象是否存在。我希望能够根据假定的一组唯一列名来验证数据库对象是否存在。这在SQL Server 2012中是否可行?即使我的测试由于良好的商业原因而过时,我也对答案感兴趣。这是我的第一直觉:

SELECT c.name AS 'ColumnName', t.name as 'TableName'
FROM sys.columns c
    INNER JOIN sys.tables t 
        ON c.object_id = t.object_id
GROUP BY c.name, t.name
HAVING 
    c.name = 'column1'
    AND c.name = 'column2'
    AND c.name = 'column3'

根据我对当前数据库的了解,我希望此查询能够为我提供3条记录,每条记录显示所有3的表达列和相同的表名。但是,此查询给出了0结果。我现在忽略了观点。有什么建议吗?

  • 我需要抓住任何包含这3个精确列的表格(如果这些列在其他地方使用而没有彼此,我不想在结果中使用它们。)

2 个答案:

答案 0 :(得分:1)

在我的问题中,我可能不够清楚。我实际上需要确保所有结果都来自同一个对象。我基本上是在找这样的东西:

SELECT c.object_id, t.name
FROM sys.columns c
    INNER JOIN sys.tables t 
        ON c.object_id = t.object_id
WHERE
    c.name IN ('column1', 'column2', 'column3')
GROUP BY
    c.object_id, t.name
HAVING
    COUNT(c.object_id) = 3

答案 1 :(得分:0)

需要更改查询,您需要使用IN运算符。话虽这么说,你也不需要GROUP BY条款,因为没有聚合(总和,最小,最大等)要求。 HAVING通常与GROUP BY子句一起使用,因此在此使用WHERE将满足您的要求。尝试下面的代码,看看你可以得到你想要的结果:

SELECT c.name AS 'ColumnName', t.name as 'TableName'
FROM sys.columns c
    INNER JOIN sys.tables t 
        ON c.object_id = t.object_id
WHERE 
    c.name in ('column1', 'column2', 'column3')