Sql-Server

如何在 SQL Server 中刪除時態表?

  • July 28, 2022

我正在嘗試在 SQL Server 中刪除一個臨時(系統版本)表。我使用了正常DROP TABLE語句。

DROP TABLE [schema].[table]
GO

這引發了以下錯誤:

對錶 ’ 的刪除表操作失敗

$$ database $$.$$ schema $$.$$ table $$’ 因為它不是系統版本化時態表上受支持的操作。

如何在 SQL Server 中刪除時態表?

要刪除系統版本控製表,您首先必須關閉系統版本控制。

   CREATE TABLE [temporal]([id]        int IDENTITY(1, 1)
                               PRIMARY KEY CLUSTERED,
                      [ValidFrom] datetime2(7) GENERATED ALWAYS AS ROW START HIDDEN
                                       NOT NULL,
                   [ValidTo]   datetime2(7) GENERATED ALWAYS AS ROW END HIDDEN
                                       NOT NULL,
                   PERIOD FOR SYSTEM_TIME([ValidFrom], [ValidTo])) WITH(SYSTEM_VERSIONING = ON(HISTORY_TABLE = [dbo].[Temporal_History]));


drop table temporal;

這將導致

表“tempdb.dbo.temporal”上的刪除表操作失敗,因為它不是系統版本化時態表上受支持的操作。

如果您關閉系統版本,您將能夠刪除表。如果您不再需要它,也不要忘記刪除歷史記錄表

ALTER TABLE dbo.temporal  SET ( SYSTEM_VERSIONING = Off )

drop table temporal;
drop table Temporal_History

如前所述,您需要SYSTEM_VERSIONING關閉。您還應該刪除歷史記錄表。

要在腳本中以自動方式執行此操作,請使用以下命令

DECLARE @schema sysname = 'dbo';
DECLARE @table sysname = 'YourTable';

DECLARE @historyTable nvarchar(500) = (
   SELECT QUOTENAME(sHist.name) + '.' + QUOTENAME(tHist.name)
   FROM sys.tables t
   JOIN sys.schemas s ON s.schema_id = t.schema_id
   JOIN sys.tables tHist ON tHist.object_id = t.history_table_id
   JOIN sys.schemas sHist ON sHist.schema_id = tHist.schema_id
   WHERE s.name = @schema
     AND t.name = @table
);

DECLARE @sql nvarchar(max);

IF @historyTable IS NOT NULL
   SET @sql = '
ALTER TABLE ' + QUOTENAME(@schema) + '.' + QUOTENAME(@table) + '
 SET ( SYSTEM_VERSIONING = OFF );

DROP TABLE ' + QUOTENAME(@schema) + '.' + QUOTENAME(@table) + ';
DROP TABLE ' + @historyTable + ';';

ELSE
   SET @sql = 'DROP TABLE ' + QUOTENAME(@schema) + '.' + QUOTENAME(@table) + ';';

EXEC (@sql);

引用自:https://dba.stackexchange.com/questions/314887