查找SQL Server数据库中所有表中的项目数(基于列名称的过滤表)

时间:2018-04-05 16:27:01

标签: sql sql-server sql-server-2008 tsql

我必须从数据库中的所有表中查找特定列(名为Ticker)的不同项目的总数。

我怎样才能做到这一点?这就是我想要的:

Table_name  |  Column | Total_Tickers
------------+---------+---------------
Table_1     | ticker  |    500
Table_2     | ticker  |    100 
Table_3     | ticker  |   5000
.
.

我知道我必须使用sp_MSForEachTable,但我不确定如何过滤那些根本没有Ticker列的表格。

这是我尝试过的:

create table #counts
(
    table_name varchar(255),
    ticker_count int
)

EXEC sp_MSForEachTable @command1='INSERT #counts (table_name, ticker_count) 
SELECT ''?'', COUNT(ticker) FROM ? ',
@whereand = 'AND ''?'' IN (Select * from information_schema.columns where 
column_name = ''%ticker%'')'

SELECT table_name, ticker_count 
FROM #counts 
ORDER BY table_name, ticker_count DESC

DROP TABLE #counts

由于我无法过滤表格,因此无法识别第7行的COUNT(ticker)

我很欣赏这方面的任何指示。感谢

1 个答案:

答案 0 :(得分:1)

这是一种更容易的方法

use your_databasename --replace with your database name
go
DECLARE @sql         VARCHAR(max)= '',
        @column_name SYSNAME = 'ticker'

SET @sql = Stuff((SELECT ' union all select Table_name = '''+ table_name + ''',[Column] = ''' + column_name
                         + ''',Total_Tickers = count(distinct '+ column_name + ') from '
                         + Quotename(table_catalog) + '.'+ Quotename(table_schema) + '.'+ Quotename(table_name)
                  FROM   information_schema.columns
                  WHERE  column_name = @column_name
                  FOR xml path('')), 1, 11, '') -- stuff is used to remove the first union all
--SELECT @sql

EXEC (@sql) 

由于必须根据列名过滤表格,因此我不认为msforeachtable会对此有所帮助。