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

问题描述 投票:0回答:2

我正在根据某些标准测试数据库对象是否存在。我希望能够根据假设的一组唯一列名来验证数据库对象是否存在。这在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个精确列的表(如果这些列在其他地方使用而没有彼此,我不希望它们在我的结果中)。
sql sql-server-2012
2个回答
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

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') 
© www.soinside.com 2019 - 2024. All rights reserved.