我有一个名为myTable
的表,其中正在进行连续插入。我将按myTable_Date
重命名该表,并通过存储过程myTable
创建一个新表。
我想知道在重命名和重新创建表期间会发生什么,它会丢弃任何数据包吗?
如果您只想更改表的名称,SQL Serversp_rename
内置的。
sp_rename myTable, myTable_Date
将名称从myTable
更改为myTable_Date
但它只会更改sys.Objects
中的名称引用,因此请确保更改任何引用并阅读有关它的文档:)
它的Microsoft文档在这里
当您将 myTable 重命名为 myTableDate 时,myTable 将不再存在,因此如果有人尝试在 myTable 中插入某些内容,它将失败。
当您创建具有相同名称和列的新 myTable 时,一切都会好起来的,插入过程将继续。
我建议您制作一个小脚本来重命名表并创建新表。像这样:
sp_rename myTable, myTable_Date
GO
CREATE TABLE myTable(
-- Table definition
)
重命名表时,将收到如下警告:"警告:更改对象名称的任何部分都可能破坏脚本和存储过程。 因此,最好快速创建新表。
另一种选择是创建一个与myTable完全相同的表,并从myTable插入所有数据,然后可以从myTable中删除它们。无需重命名,无需删除,插入过程不会中断。
我想知道在重命名和重新创建 表,它会丢弃任何数据包吗?
在重新创建表之前,重命名表后尝试的插入将出错。您可以通过执行事务中的任务来避免这种情况。如果在提交事务之前尝试插入,但不丢失任何行,则会发生短期阻塞。例如:
CREATE PROC dbo.ReanmeMytableWithDate
AS
DECLARE @NewName sysname = 'mytable_' + CONVERT(nchar(8), SYSDATETIME(), 112);
SET XACT_ABORT ON;
BEGIN TRY;
BEGIN TRAN;
EXEC sp_rename N'dbo.mytable', @NewName;
CREATE TABLE dbo.mytable(
col1 int
);
COMMIT;
END TRY
BEGIN CATCH
THROW;
END CATCH;
GO
我不知道您像这样重命名表的用例,但似乎@Damien_The_Unbeliever建议的那样,表分区可能是一种更好的方法。尽管表分区以前需要企业版,但该功能在标准版中可用,从 SQL Server 2016 SP1 以及 Azure SQL 数据库开始。