【发布时间】:2019-09-13 17:54:36
【问题描述】:
这是我的情况。我们这里有一个数据库,其中只有一堆日志记录。我们有一个单一的作业设置来清除该表上超过 30 天的日志中的任何内容……这很容易设置。
所以我的问题是,现在他们需要某种脚本或存储过程来删除该数据库中所有表中超过 30 天的所有内容。你知道有什么可以做到这一点吗?我已经在网上搜索了几个小时,查看存储过程和查询并没有真正到达任何地方。我创建了一个查询,该查询单独对该数据库中的所有表执行此操作,但是当他们向该数据库添加和删除表时,他们想要更动态的东西,这样我们就不必继续编辑查询。
所以这将是一个存储过程,基本上会对数据库中的所有表执行此操作
USE TESTLog;
delete FROM TestLogTable WHERE Date < GETDATE() – 30
有什么想法可以做到这一点吗?
更新: 因此,我与她推荐使用存储过程(如下)的朋友交谈,但我似乎无法让 exec 与删除一起运行。打印效果很好。但是当我更改为 EXEC (SQL) 时它不起作用。
USE [TEST_DELETE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--Creates stored procedure
ALTER PROCEDURE [dbo].[TableCleanup]
AS
--Code starts here for table cleanup--
DECLARE @myCursor cursor;
DECLARE @tableName CHAR(100),
@sql CHAR(300)
BEGIN
SET @myCursor = CURSOR FOR
SELECT rtrim(table_schema) + '.' + rtrim(Table_Name) as tableName
FROM information_schema.tables Where table_type = 'Base Table'
OPEN @myCursor
FETCH NEXT FROM @myCursor INTO @tableName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'delete FROM ' + rtrim(@tableName )+ ' WHERE Date < GETDATE() – 30'
EXEC (@sql)
FETCH NEXT FROM @myCursor INTO @tableName
END
CLOSE @myCursor
DEALLOCATE @myCursor
END
【问题讨论】:
-
盲目地对数据库中的每个表执行此操作似乎是一个非常糟糕的主意。您在每个表中都有该列吗?查找表呢? RI呢?您必须在父行之前删除子行。
-
他们要删除的是所有表中的 DATE COLUMN。我不知道为什么,他们只是想这样做。大多数表都有 DATE 列,但少数有 STARTDATE 和 ENDDATE,他们说他们不关心这些表……只关心那些具有 DATE 列的表。
-
不能删除列,只能删除行。是否要将 DATE 列设置为 NULL?您将不得不查询 sys.columns 并找到具有所需列名的表,然后针对这些表运行查询。
-
抱歉你是对的,这就是我的意思...行而不是列。
标签: sql sql-server