今天群裡的一個朋友問了個問題:
如何把數據庫裡所有表的記錄數都統計出來? 由於以前我曾經試著寫過一個存儲過程,作用就是刪除所有表的內容,思路是這樣的:
首先通過sysobjects表構造一個sql語句字符串'DELETE 表名',其中表名就是sysobjects中的name列,把這些DELETE語句字符串連接起來的方法一是通過游標,二則是直接利用如下語句:
select @sql = @sql + 'DELETE ' + name from sysobjects where xtype='U';
這是一個很有用的技巧,在合適的地方用會很大程度的優化語句運行速度.
然後就是通過exec(@sql)執行該字符串.
而把數據庫所有表的記錄數統計出來和這個思路幾乎完全一樣,不同的就是把'DELETE 表名' 改為'SELECT 表名,COUNT(1) FROM 表名',主要這點不同而已,如果構造完字符串並執行完畢,可以把結果輸出到一個臨時表,那麼再統計所有記錄數就輕而易舉了.
下面就是我寫的一個語句:
declare @sql varchar(8000),@count int,@step int
set nocount on
--@step越大運行速度越快,但如果太大會造成生成的sql字符串超出限制導致語句不完整出錯
--建議為50
set @step = 50
if object_id(N'tempdb.db.#temp') is not null
drop table #temp
create table #temp (name sysname,count numeric(18))
if object_id(N'tempdb.db.#temp1') is not null
drop table #temp1
create table #temp1 (id int identity(1,1),name sysname)
insert into #temp1(name)
select name from sysobjects where xtype = 'u';
set @count = @@rowcount while @count>0
begin
set @sql = ''
select @sql = @sql + ' select ''' + name + ''',count(1) from ' + name + ' union'