--創建函數
USE tempdb
GO
IF OBJECT_ID ('dbo.P_QueryTableRecord') IS NOT NULL
DROP PROCEDURE dbo.P_QueryTableRecord
GO
CREATE PROCEDURE P_QueryTableRecord(
@dbname_prefix VARCHAR(300) --數據庫前綴名
)
AS
BEGIN
DECLARE
@tmpSql VARCHAR(900),
@dbname VARCHAR(300),
@tablename VARCHAR(300),
@querysql VARCHAR(900)
CREATE TABLE #tmp_all_table_record(
dbname VARCHAR(300),
tablename VARCHAR(300),
rowcounts INT
)
CREATE TABLE #tmp_tbs(
tablename VARCHAR(300),
querysql VARCHAR(900)
)
--1.定義遊標(所有符合前綴條件的庫名)
DECLARE dbs CURSOR FOR SELECT name FROM master..sysdatabases WHERE name LIKE @dbname_prefix + '%'
--2.打開遊標
OPEN dbs
--3.獲取記錄
FETCH dbs INTO @dbname
--4.循環處理每個庫
WHILE @@SQLSTATUS = 0
BEGIN
--4.1 清空臨時表
TRUNCATE TABLE #tmp_tbs
--4.2處理臨時表
SELECT @tmpSql = "INSERT INTO #tmp_tbs SELECT name, 'INSERT INTO #tmp_all_table_record "
+ " SELECT ''" + @dbname + "'', ''' + name + ''', COUNT(*) FROM " + @dbname + "..' + name " + " FROM " + @dbname + "..sysobjects WHERE type = 'U' "
EXECUTE (@tmpSql)
--4.2.1 定義表列表遊標
DECLARE tbs CURSOR FOR SELECT tablename, querysql FROM #tmp_tbs
--4.2.2 打開表列表遊標
OPEN tbs
--4.2.3 獲取記錄
FETCH tbs INTO @tablename, @querysql
--4.2.4處理每個表
WHILE @@SQLSTATUS = 0
BEGIN
--4.2.5執行腳本
PRINT @querysql
EXECUTE (@querysql)
--4.2.6處理下一條
FETCH tbs INTO @tablename, @querysql
END
CLOSE tbs
DEALLOCATE CURSOR tbs
--4.3 處理下一條
FETCH dbs INTO @dbname
END
--5.關閉遊標
CLOSE dbs
--6.銷燬遊標
DEALLOCATE CURSOR dbs
SELECT dbname, tablename, rowcounts FROM #tmp_all_table_record ORDER BY rowcounts DESC
DROP TABLE #tmp_tbs
DROP TABLE #tmp_all_table_record
END
GO
--執行函數並查看結果
--執行完畢後返回的結果集就是我們想要的結果。在需要時也可以修改存儲過程中的臨時表爲實體表,根據需求調整即可
USE tempdb
GO
EXECUTE tempdb..P_QueryTableRecord 'DB_TASK'
GO