使用存储过程重命名和重新创建 MS-SQL 表的过程是什么?



我有一个名为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 数据库开始。

最新更新