这是我的情况。我们这里有一个数据库,只有一堆日志记录正在进行中。我们只有一个作业设置来清除该表上30天以上的日志中的任何内容......这很容易设置。
所以我的问题是,现在他们想要某种脚本或存储过程来删除该数据库中所有表中超过30天的所有内容。你知道有什么可以做到的吗?我一直在网上搜索几个小时,现在通过存储过程和查询找不到任何地方。我创建了一个查询,它单独对该数据库中的所有表执行此操作,但是当他们向该数据库添加和删除表时,他们需要更动态的内容,因此我们不必继续进行编辑查询。
因此,存储的prodecure基本上会对数据库中的所有表执行此操作
USE TESTLog;
delete FROM TestLogTable WHERE Date < GETDATE() – 30
我有什么想法可以做到这一点?
更新 所以我和她推荐使用存储过程的朋友谈过(下面),但我似乎无法让exec与删除一起运行。打印效果很好。但是,当我更改为EXEC(SQL)时,它不起作用。
USE [TEST_DELETE]
GO
/****** Object: StoredProcedure [dbo].[TableCleanup] Script Date: 12/18/2014 9:41:24 AM
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
答案 0 :(得分:1)
尝试此操作,假设日期字段存在于该数据库的所有表中
USE TESTLog;
GO
EXEC sp_MSForEachTable 'DELETE FROM ? WHERE [Date] < GETDATE() - 30'
GO
答案 1 :(得分:0)
查询master以获取所有表名。然后将表名应用于SQL
答案 2 :(得分:0)
您需要查询sys.columns以确定哪些表具有名为Date的列。这将为您生成删除语句。我会使用stuff来生成这个列表,然后使用sp_executesql执行整个操作。
declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'delete from [' + OBJECT_NAME(OBJECT_ID) + '] where [Date] < DATEADD(DAY, -30, GETDATE());'
from sys.columns
where name = 'Date'
select @SQL
exec sp_executesql @SQL