Sql 获取所有数据库中表的行数

Sql 获取所有数据库中表的行数,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,搜索了一点,没有看到任何真正符合我需要的东西,尽管除了基本的select语句之外,我并不真正理解SQL,所以可能我错过了它。几个月前在学校上过SQL课 我有: 运行SQL 2008 R2的虚拟Windows Server 2008 R2。我通过MS SQL Server Management Studio进行连接 90-100个数据库 所有数据库都具有相同的表结构,每个数据库都是不同的客户端 我想: 搜索所有数据库,并返回表TableName大于5000条记录的所有数据库的列表。 我可以安排使用

搜索了一点,没有看到任何真正符合我需要的东西,尽管除了基本的select语句之外,我并不真正理解SQL,所以可能我错过了它。几个月前在学校上过SQL课

我有:

运行SQL 2008 R2的虚拟Windows Server 2008 R2。我通过MS SQL Server Management Studio进行连接 90-100个数据库 所有数据库都具有相同的表结构,每个数据库都是不同的客户端 我想:

搜索所有数据库,并返回表TableName大于5000条记录的所有数据库的列表。 我可以安排使用该列表的某种脚本,如果它发现一个DB的TableName表超过5000条记录,就会删除任何超过x天(比如30天)的记录。任何一种记录过去几天发生的事情都是一种奖励。 任何帮助都将不胜感激。多谢各位


编辑/更新2015年2月24日:Hiren Dhaduk提供了一个运行良好的存储过程。谢谢

您可以在任何数据库中使用以下存储过程。然后通过传递表名和noofrowstable的最小行数来运行此存储过程,在您的情况下,它将是5000:

CREATE PROCEDURE usp_FindLargeTables
@TableName VARCHAR(256) , @NoOfRows int
AS
BEGIN
    DECLARE @DBName VARCHAR(256)
    DECLARE @varSQL VARCHAR(512)
    DECLARE @getDBName CURSOR

SET @getDBName = CURSOR FOR
SELECT name
FROM sys.databases
WHERE state != 6

CREATE TABLE #TmpTable (TableName VARCHAR(256),
SchemaName VARCHAR(256),
DBName VARCHAR(256))

OPEN @getDBName
FETCH NEXT
FROM @getDBName INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN

    SET @varSQL =  'USE ' + @DBName + ';
    INSERT INTO #TmpTable
    SELECT 
    sysobjects.Name as TableName
    , sysindexes.Rows as NoOfRows , '''+ @DBName + ''' AS DBName
    FROM
    sysobjects
    INNER JOIN sysindexes
    ON sysobjects.id = sysindexes.id
    WHERE
    type = ''U''
    AND sysindexes.IndId < 2 
    and sysobjects.Name = '''+ @TableName +''' and sysindexes.Rows > ' + CONVERT(VARCHAR, @NoOfRows) + ''

EXEC (@varSQL)
FETCH NEXT
FROM @getDBName INTO @DBName
END
CLOSE @getDBName
DEALLOCATE @getDBName

SELECT *
FROM #TmpTable
WHERE DBName != 'master'

-- STEP 2
DECLARE @DYNAMICQUERY VARCHAR(MAX)

SET @DYNAMICQUERY = 
REPLACE((
SELECT 'DELETE FROM ['+ DBName +'].[dbo].['+ TableName +'] where Createdate   < DATEADD(day, -30, GETDATE());'
FROM #TmpTable
WHERE DBName != 'master'
FOR XML PATH('')
), '&lt;' , '<');

EXEC(@DYNAMICQUERY);

DROP TABLE #TmpTable
END
示例:usp_FindLargeTables'DeltaStuds',5000

关于第二点的澄清:

除非在发生更改时运行跟踪,否则这是不可能的


因此,要做到这一点,我建议您在此表中添加一个名为createdate的列,然后您将能够删除30天之前创建的记录。

您所要求的内容对您的设置非常定制

您可以使用以下查询来标识行数大于5000的表

但您需要类似于此链接的内容才能为所有DBs运行它。我不知道有什么更简单的方法


对于第二部分,您必须设置一个删除过程,该过程从上述查询中获取结果集,创建一个动态查询,并根据日期字段删除行。在这个过程中,您可以注入一种审计机制,记录删除操作、行计数、日期时间等的日志。

谢谢@SoulTrain。我将对此进行测试并报告。嘿@SoulTrain,我试图用sp_MSforeachdb“your query”包装您的查询,但它返回了空白结果。我知道至少有两个数据库有一个DeltaStuds表,它有150000多条记录,这就是为什么我要找出这个问题,所以我可以运行一个计划的进程,删除大部分记录,如果不是所有的,因为一旦它变得那么大,就会导致错误@SoultrainThank@Hiren Dhaduk,我也会测试一下并报告回来。好的,如果你发现一些关于在不维护列的情况下获取行的插入日期的信息,请分享。hi@Hiren Dhaduk,你提供的第一个查询只针对一个数据库…而不是所有数据库。它可以工作,但只适用于我运行查询所针对的数据库。此外,@Hiren Dhaduk,我试图用sp_MSforeachdb“your query”包装您的第一个查询,但它返回了空结果。可能您的表的行数不超过5000行。
SELECT sc.name +'.'+ ta.name TableName
 FROM sys.tables ta
 INNER JOIN sys.partitions pa
 ON pa.OBJECT_ID = ta.OBJECT_ID
 INNER JOIN sys.schemas sc
 ON ta.schema_id = sc.schema_id
 WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
 and ta.name = 'DeltaStuds'
 GROUP BY sc.name,ta.name
 having SUM(pa.rows)>5000