我有一个包含数百个表的数据库,其中一些表具有名为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 ...
,然后使用EXEC或sp_executesql运行它。
那么,还有其他选项可以自动化吗?
答案 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);