以下代码实现了这一点:
WITH a AS (
SELECT
SCHEMA_NAME(t.schema_id) AS PrimarySchema
, t.name AS PrimaryTable
, OBJECT_SCHEMA_NAME(t.history_table_id) AS HistorySchema
, OBJECT_NAME(t.history_table_id) AS HistoryTable
, i.name AS HistoryIndexName
FROM sys.tables AS t
JOIN sys.indexes AS i ON t.history_table_id = i.object_id -- There should only be one index on each history table
WHERE t.temporal_type = 2 -- SYSTEM_VERSIONED_TEMPORAL_TABLE
), b AS (
SELECT a.PrimarySchema
, a.PrimaryTable
, CONCAT(a.PrimarySchema, N'.', a.PrimaryTable) AS PrimarySchemaTable
, a.HistorySchema
, a.HistoryTable
, CONCAT(a.HistorySchema, N'.', a.HistoryTable) AS HistorySchemaTable
, a.HistoryIndexName
FROM a
), c AS (
SELECT b.PrimarySchema, b.PrimaryTable
, CONCAT(N'ALTER TABLE ', b.PrimarySchemaTable , N' SET (SYSTEM_VERSIONING = OFF);') AS L1
, CONCAT(N'ALTER TABLE ', b.PrimarySchemaTable , N' DROP PERIOD FOR SYSTEM_TIME;') AS L2
, N'GO' AS L3
, CONCAT(N'ALTER TABLE ', b.PrimarySchemaTable , N' ALTER COLUMN ValidFrom DATETIME2(3) NOT NULL;') AS L4
, CONCAT(N'ALTER TABLE ', b.PrimarySchemaTable , N' ALTER COLUMN ValidTo DATETIME2(3) NOT NULL;') AS L5
, CONCAT(N'DROP INDEX ', b.HistoryIndexName, N' ON ', b.HistorySchemaTable , N';') AS L6
, CONCAT(N'ALTER TABLE ', b.HistorySchemaTable, N' ALTER COLUMN ValidFrom DATETIME2(3) NOT NULL;') AS L7
, CONCAT(N'ALTER TABLE ', b.HistorySchemaTable, N' ALTER COLUMN ValidTo DATETIME2(3) NOT NULL;') AS L8
, CONCAT(N'ALTER TABLE ', b.PrimarySchemaTable , N' ADD PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);') AS L9
, CONCAT(N'ALTER TABLE ', b.PrimarySchemaTable , N' SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=', b.HistorySchemaTable, N'));') AS L10
, CONCAT(N'CREATE CLUSTERED INDEX ', b.HistoryIndexName, N' ON ', b.HistorySchemaTable, N'(ValidTo ASC, ValidFrom ASC);') AS L11
, N'GO' AS L12
, N'-------------------------------------------------------------------------------------------------------------------------' AS L13
FROM b
)
SELECT CONCAT(c.L1, CHAR(10), c.L2, CHAR(10), c.L3, CHAR(10), c.L4, CHAR(10), c.L5, CHAR(10), c.L6, CHAR(10), c.L7, CHAR(10), c.L8, CHAR(10), c.L9, CHAR(10), c.L10, CHAR(10), c.L11, CHAR(10), c.L12, CHAR(10), c.L13, CHAR(10)) AS Statements
FROM c
ORDER BY c.PrimarySchema, c.PrimaryTable