Sql-Server
如何在 SQL Server 中刪除時態表?
我正在嘗試在 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);