sql - 将数据归档到另一个表的动态存储过程
问题描述
CREATE PROCEDURE dbo.ArchiveData
(@CutOffDate datetime = NULL)
AS
BEGIN
SET NOCOUNT ON
IF @CutOffDate IS NULL
BEGIN
SET @CutOffDate = DATEADD(mm, -6, CURRENT_TIMESTAMP)
END
ELSE
BEGIN
IF @CutOffDate > DATEADD(mm, -3, CURRENT_TIMESTAMP)
BEGIN
RAISERROR ('Cannot delete orders from last three months', 16, 1)
RETURN -1
END
END
BEGIN TRAN
INSERT INTO Archive.dbo.Orders
SELECT *
FROM dbo.Orders
WHERE OrderDate < @CutOffDate
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RAISERROR ('Error occurred while copying data to Archive.dbo.Orders', 16, 1)
RETURN -1
END
INSERT INTO Archive.dbo.OrderDetails
SELECT *
FROM dbo.OrderDetails
WHERE OrderID IN (SELECT OrderID
FROM dbo.Orders
WHERE OrderDate < @CutOffDate)
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RAISERROR ('Error occurred while copying data to Archive.dbo.OrderDetails', 16, 1)
RETURN -1
END
DELETE dbo.OrderDetails
WHERE OrderID IN (SELECT OrderID
FROM dbo.Orders
WHERE OrderDate < @CutOffDate)
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RAISERROR ('Error occurred while deleting data from dbo.OrderDetails', 16, 1)
RETURN -1
END
DELETE dbo.Orders
WHERE OrderDate < @CutOffDate
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RAISERROR ('Error occurred while deleting data from dbo.Orders', 16, 1)
RETURN -1
END
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN
RETURN 0
END
END
如何在一个存储过程中一次归档所有表以归档表?我需要在普通表中保留过去 30 天,但将所有过去的数据存档到存档中。我需要使用 If Else 条件吗?我需要动态获取所有表并动态归档表。我需要为此使用动态 SQL 查询。
解决方案
如果您的存档表结构与普通表相同,那么您可以通过您的表及其关系顺序进行循环
您可以借助此链接按关系顺序获取表格:
将表插入临时表并为每个表生成插入查询
DECLARE @T AS TABLE(ID INT IDENTITY(1,1), TableName NVARCHAR(100))
-- INSERT INTO @T the tables with relation order
while(exists select * from @T)
BEGIN
DECLARE @ID = (SELECT TOP 1 ID FROM @T ORDER BY ID)
DECLARE @TableName = (SELECT TOP 1 TableName FROM @T WHERE ID=@ID)
EXEC('INSERT INTO Archive.dbo.' + @TableName + ' SELECT * FROM ' + @TableName)
DELETE FROM @T WHERE ID = @ID
END
您可以通过相同的循环但以相反的顺序从普通表中删除数据“SELECT TOP 1 ID FROM @T ORDER BY ID DESC”
推荐阅读
- python-3.x - 无法从 kdeplot 读取数据
- android - 将 arraylist.map() 与 kotlin 协程一起使用时出现 ArrayIndexOutOfBoundsException
- kubernetes - 使用 Kind: deployment 限制 Kubernetes 中 Pod 的首次部署
- java - Java内存模型和局部变量
- r - R中的system/system2命令
- go - go 1.16 embed - 去除目录名
- flutter - flutter/cloud firestore:如何从文档中只获取一个数据?
- css - SVG 在 WP Elementor 中有两种颜色作为徽标
- java - 为什么我使用 Netty 在此端口上创建了 UDP 监视器时端口的状态未侦听?
- javascript - 进行更改时,如何更新我的 serviceworker 脚本以更新缓存页面?