SQL Server创建表变量来保存将截断永久表后将插入到永久表中的记录
问题描述:
我有一个约700万行的表,我需要执行截断的表。我会这样做,如下所示:SQL Server创建表变量来保存将截断永久表后将插入到永久表中的记录
BEGIN TRY
BEGIN TRANSACTION
Declare @RecsToKeep Table
(
Id int
)
SELECT Id
FROM RealTable
Where CONVERT (DATE, CreatedDate) > '2017-08-16'
Declare @KeepTheseRecs Table
(
Id int
)
Insert into @KeepTheseRecs
Select *
From RealTable Where Id IN (Select Id From @RecsToKeep)
Truncate Table RealTable
Insert into RealTable
Select *
From @KeepTheseRecs
COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
真正的表和表变量具有相同的列结构。这是做到这一点的正确方法吗?
答
首先,您没有根据查询改变表中的任何内容。您只需将记录从A移动到B并返回到A.
更简单的方法是将所有移动都放在一起。
delete from RealTable
where someColumn = 'someValue' --or what ever condition you want
如果你真的要上演的记录,你会至少要对Insert Into
语句WHERE
条款。我真的不明白你为什么需要这样做。
如果插入失败并且丢失数据会发生什么情况?至少没有交易似乎是危险的。我认为审计表值得考虑。 –