2015-06-14 54 views
0

作爲新版本的一部分,偶爾我們會備份少量表格,然後在穩定期內刪除它們。 我想使它可配置,即爲要刪除的表列表設置命名約定,然後在穩定期結束後將其刪除,然後在穩定期結束後將其刪除。需要刪除表的列表,並且應該在SQL SERVER中進行配置

這是我的計劃。

  1. 重命名我想要刪除的所有表,後綴爲「_TBR」(將被刪除)。
  2. 添加一個帶有yyyymmdd格式的後綴,例如。如果表的名稱是EmployeeDetails,它將是EmployeeDetails_TBR_20150614。

因此,我將創建一個存儲過程,這將選擇所有具有TBR後綴的表,並將其放置到一個臨時表,與日期時間一起 如

select 
    name AS 'TableName', 
    convert (datetime, substring (name, len(name)-7,8)) as 'DeletedOn' 
from 
    sys.tables 
where 
    name like '%_tbr_%' and 
    type ='u' 

現在

SELECT TableName FROM #TempTable WHERE DeletedOn <=GETDATE() 

這將選擇所有超出指定日期的表。 現在,聲明一個遊標,然後循環並刪除它。

我會安排一份工作來每週運行這個存儲過程,它會照顧。

有沒有其他更聰明,最優化的方法呢?

+0

的是,雖然它是在給錯誤的SELECT語句是當仁不讓編輯 – mohan111

回答

2

一種方法:

CREATE PROC dbo.DropBackupTables 
AS 

DECLARE @DropScript nvarchar(MAX) = (
    SELECT N'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + N'.' + QUOTENAME(name) + N';' 
    FROM sys.tables 
    WHERE 
     name LIKE N'%[_]TBR[_][2][0-9][0-9][0-9][0-1][0-9][0-3][0-9]' 
     AND RIGHT(name, 8) <= CONVERT(char(8), GETDATE(), 112) 
     FOR XML PATH('') 
     ); 

EXEC sp_executesql @DropScript; 
GO 
0

對我來說,好像你已經過了複雜的事情。
而不是重命名錶和使用遊標,我只是簡單地向數據庫添加另一個表,其中包含需要刪除的表的名稱以及刪除的日期。
然後我會使用一個存儲過程來創建一個動態sql來實際刪除這些表。
這樣的事情應該做的伎倆:

CREATE TABLE TablesToDrop 
(
    Table_Name sysname PRIMARY KEY, 
    Delete_Date date 
) 

CREATE PROCEDURE DropTables 
AS 
BEGIN 
    DECLARE @Sql varchar(max) = '' 

    SELECT @Sql = @Sql + 'DROP TABLE '+ Table_Name +';' 
    FROM TablesToDrop 
    WHERE Delete_Date <= GETDATE() 
    EXEC(@Sql) 

END 

注1:非常小心誰去插入記錄到該表。

注2:最後一個表被丟棄是TablesToDrop表...

相關問題