当前位置:首页 > 日常 > 正文

删除数据库空行的表格

日常 · Jul 31, 2024

上上周,一个有一亿数据量的数据库,要处理提取特征,运算归纳分类零售额,并按天组合。关键是这个数据库有将近900个表格,完全没有做任何的中文注释。部分表格还是用了不同编码的格式存储。除了头大靠猜外,各种ai工具都无法有效辅助推测数据之间的关系。

那么如何有效处理呢,第一步,是删除空行的表格,虽然空行不一定就是毫无用处,但至少现阶段是无法从空行获得有效价值,不会带来任何好处。删除空行表语法:


DECLARE @TableName NVARCHAR(255)
DECLARE @SQL NVARCHAR(MAX)

DECLARE TableCursor CURSOR FOR
SELECT TABLE_SCHEMA + '.' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'

OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = 'IF NOT EXISTS (SELECT 1 FROM ' + @TableName + ') DROP TABLE ' + @TableName
    EXEC sp_executesql @SQL
    FETCH NEXT FROM TableCursor INTO @TableName
END

CLOSE TableCursor
DEALLOCATE TableCursor



统计数据库行数:

USE [mons];

-- 获取所有表的总行数
SELECT 
    SUM(p.rows) AS TotalRowCount
FROM 
    sys.tables AS t
    INNER JOIN sys.indexes AS i ON t.object_id = i.object_id
    INNER JOIN sys.partitions AS p ON i.object_id = p.object_id AND i.index_id = p.index_id
WHERE 
    t.is_ms

删除所有触发器:

USE [mons]; -- 替换为你的数据库名称

DECLARE @sql NVARCHAR(MAX) = '';

-- 查找所有触发器并生成删除语句
SELECT @sql = @sql + 'DROP TRIGGER ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ';' + CHAR(13)
FROM 
    sys.triggers t
    INNER JOIN sys.objects o ON t.object_id = o.object_id
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id;

-- 输出 SQL 语句进行调试
PRINT @sql;

-- 执行删除触发器的 SQL 语句
EXEC sp_executesql @sql;


列出所有表格的行数,并按照从大到小排序:

SELECT 
    o.name AS TableName,
    p.rows AS RowCounts
FROM 
    sys.partitions p 
    JOIN sys.objects o ON p.object_id = o.object_id
WHERE 
    p.index_id IN (0, 1) -- 0 表示堆,1 表示聚集索引
    AND p.rows > 0
    AND o.type = 'U' -- 确保是用户表
ORDER BY 
    p.rows DESC;

删除所有没有执行代码的存储过程:

USE [mons]; -- 替换为你的数据库名称

DECLARE @sql NVARCHAR(MAX) = '';

-- 查找所有没有代码的存储过程
SELECT @sql = @sql + 'DROP PROCEDURE ' + QUOTENAME(s.name) + '.' + QUOTENAME(p.name) + ';' + CHAR(13)
FROM 
    sys.procedures p
    INNER JOIN sys.schemas s ON p.schema_id = s.schema_id
WHERE 
    OBJECT_DEFINITION(p.object_id) = ''  -- 存储过程没有任何代码
    OR OBJECT_DEFINITION(p.object_id) IS NULL;  -- 存储过程定义为空

-- 输出 SQL 语句进行调试
PRINT @sql;

-- 执行删除存储过程的 SQL 语句
EXEC sp_executesql @sql;



删除输出库中,所有旧于7月10日的数据,则执行两个分步:


1:首先,需要识别所有表格中包含日期或时间类型字段的表格和字段。以下查询将帮助识别这些字段:

USE [mons]; -- 替换为你的数据库名称

SELECT 
    t.name AS TableName,
    c.name AS ColumnName,
    ty.name AS DataType
FROM 
    sys.tables t
    INNER JOIN sys.columns c ON t.object_id = c.object_id
    INNER JOIN sys.types ty ON c.user_type_id = ty.user_type_id
WHERE 
    ty.name IN ('datetime', 'datetime2', 'date', 'smalldatetime', 'time')
ORDER BY 
    t.name, c.name;

2:基于识别的表格和字段,生成删除数据的 SQL 语句。以下脚本会创建动态 SQL 语句以删除所有日期字段中早于 2024-07-10 的数据。

USE [mons]; -- 替换为你的数据库名称

DECLARE @DateThreshold DATE = '2024-07-10';
DECLARE @sql NVARCHAR(MAX) = '';

-- 生成删除语句
SELECT @sql = @sql + 'DELETE FROM ' + QUOTENAME(t.name) + ' WHERE ' 
    + QUOTENAME(c.name) + ' < ''' + CONVERT(NVARCHAR, @DateThreshold, 120) + ''';'
    + CHAR(13) + CHAR(10)
FROM 
    sys.tables t
    INNER JOIN sys.columns c ON t.object_id = c.object_id
    INNER JOIN sys.types ty ON c.user_type_id = ty.user_type_id
WHERE 
    ty.name IN ('datetime', 'datetime2', 'date', 'smalldatetime', 'time');

-- 输出 SQL 语句进行调试
PRINT @sql;

-- 执行删除语句
EXEC sp_executesql @sql;


手机扫描二维码访问

您是本站第5247名访客 今日有0篇新文章