我必须从数据库中的所有表中查找特定列(名为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)
!
我很欣赏这方面的任何指示。感谢
答案 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
会对此有所帮助。