Я использую временные таблицы с автоматически сгенерированными таблицами истории, поэтому я не знаю их имен.Тем не менее, документы Microsoft предоставляют информацию о том, как составить список таблиц истории, поэтому у меня есть способ получить эти имена.
Я не знаю, знаете ли вы это, но вы можете указать имяТаблица истории несколькими способами.
Если вы создаете свою собственную таблицу истории:
ALTER TABLE [TemporalTable] SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[HistoryTable]))
Или, если вы хотите, чтобы ваша таблица истории была создана для вас:
CREATE TABLE [dbo].[TemporalTable](
[Id] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [DF_TemporalTable_Id] DEFAULT(NEWID()),
[SysStartTime] DATETIME2(2) GENERATED ALWAYS AS ROW START NOT NULL CONSTRAINT [DF_TemporalTable_SysStartTime] DEFAULT(SYSUTCDATETIME()),
[SysEndTime] DATETIME2(2) GENERATED ALWAYS AS ROW END NOT NULL CONSTRAINT [DF_TemporalTable_SysEndTime] DEFAULT(CONVERT(DATETIME2(2),'9999-12-31 23:59:59.99')),
CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY],
PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])
) ON [PRIMARY]
WITH
(
SYSTEM_VERSIONING = ON ( HISTORY_TABLE = [dbo].[HistoryTable] )
)
Кроме этого, я не знаю способа создания хранимой процедуры, которая принимает имя таблицы в качестве параметра и удаляет его без использования динамического SQL.Нечто подобное ниже будет необходимо.В зависимости от того, хотите ли вы, чтобы хранимая процедура искала имя таблицы истории, связанной с ней, вы можете добавить запрос, который вы упомянули в своем сообщении, вместо параметра.
CREATE PROCEDURE DeleteTemporalTable (@tableName NVARCHAR(MAX), @historyTableName) AS
BEGIN
EXEC ('
IF EXISTS (
SELECT
1
FROM
SYSOBJECTS
WHERE
id = OBJECT_ID(N''[dbo].[' + @tableName + ']'') AND
OBJECTPROPERTY(id, N''IsTable'') = 1 AND
OBJECTPROPERTY(id, N''TableTemporalType'') = 2
)
BEGIN
ALTER TABLE [dbo].[' + @tableName + '] SET (SYSTEM_VERSIONING = OFF)
END
DROP TABLE IF EXISTS [dbo].[' + @tableName + ']
DROP TABLE IF EXISTS [dbo].[' + @historyTableName + ']')
END
Если вы просто ищетедля способа удаления всех таблиц, и вы хотите что-то, что работает с временными таблицами, я использую скрипт:
DECLARE @temporalTableName varchar(max) = (SELECT TOP 1 [name] FROM sys.tables WHERE [temporal_type_desc] = 'SYSTEM_VERSIONED_TEMPORAL_TABLE')
WHILE @temporalTableName IS NOT NULL
BEGIN
EXEC('ALTER TABLE [dbo].[' + @temporalTableName + '] SET (SYSTEM_VERSIONING = OFF)')
SET @temporalTableName = (SELECT TOP 1 [name] FROM sys.tables WHERE [temporal_type_desc] = 'SYSTEM_VERSIONED_TEMPORAL_TABLE')
END
DECLARE @tableName varchar(max) = (SELECT TOP 1 [name] FROM sys.tables)
WHILE @tableName IS NOT NULL
BEGIN
EXEC('DROP TABLE [dbo].[' + @tableName + ']')
SET @tableName = (SELECT TOP 1 [name] FROM sys.tables)
END