如何计算在具有特定列的所有表中出现的值?

时间:2018-12-15 10:41:32

标签: sql sql-server tsql count

我有一个包含数百个表的数据库,其中一些表具有名为column1的列。我想计算这些表中特定值的出现次数,如下所示:

Table  | Count
-------|------
table1 |  0
table2 |  5
...

第一部分(查找表列表)是使用here中的代码完成的。但是我不知道如何在查询中输入这些名称。如another question中所述,表名和列名在静态查询中应为静态。我从该答案中得到的是,我必须生成一些类似的tsql:

SELECT 'table1' AS [Table], count(*) AS [Count] FROM table1 WHERE column1 = somevalue
UNION SELECT 'table2' AS [Table], count(*) AS [Count] FROM table2 WHERE column1 = somevalue
UNION ...

,然后使用EXECsp_executesql运行它。

那么,还有其他选项可以自动化吗?

1 个答案:

答案 0 :(得分:0)

由于JNevil,我使用了他的注释中建议的代码。需要更改的部分标有-- <--

简而言之,它将查找所有具有名为columnname的列的表的名称,并进行一些字符串操作以为每个表生成一个SELECT命令,然后将所有命令连接起来以形成一个单个UNION命令。最后,它使用EXEC运行此命令。

USE dbname; -- <-- the db name

DECLARE @Command AS VARCHAR(MAX);

SET @Command = (
        SELECT (
                SELECT (
                        'SELECT ''' + t.NAME + ''' AS [Table], count(*) as [Count] FROM [' + t.
                        NAME + '] WHERE [' + c.NAME + '] like ''%somevalue%'' ' + CASE  -- <-- the value that you are looking for
                            WHEN LEAD(c.NAME) OVER (
                                    ORDER BY t.NAME
                                    ) IS NOT NULL
                                THEN 'UNION ALL ' + CHAR(10)
                            END
                        )
                FROM sys.columns c
                INNER JOIN sys.tables t ON c.object_id = t.object_id
                WHERE c.NAME = 'columnname' -- <-- the column name
                FOR XML path('')
                )
        );

SET @Command = SUBSTRING(@Command, 1, LEN(@Command) - 12); -- remove last UNION ALL

-- PRINT @Command; -- just to see the result

EXEC (@Command);