2011-09-15 15 views
5

का उपयोग कर 12 महीने से अधिक पुरानी तालिकाएं हटाएं मैं 12 महीने से अधिक पुरानी तालिकाएं छोड़ने में सक्षम होना चाहता हूं। तालिकाओं में उनके नाम पर दिनांक (महीना और वर्ष) होता है। उदाहरण के लिए TABLE_A_2011_01 की तारीख January 2011 है।तालिका नाम

मैं जो करना चाहता हूं वह उन तालिकाओं को छोड़ देता है जहां दिनांक भाग 12 महीने से अधिक पुराना है। अगर आज की तारीख September 15, 2011 है, तो मैं September 15, 2010 से पुरानी सभी तालिकाएं छोड़ना चाहता हूं।

उत्तर

4
DECLARE @sql NVARCHAR(MAX) = N''; 

;WITH p(o,d) AS 
(
    SELECT QUOTENAME(SCHEMA_NAME([schema_id])) + '.' + QUOTENAME(name), 
     d = RIGHT(REPLACE(name, '_', ''), 6) + '01' 
     FROM sys.tables 
     WHERE ISDATE(RIGHT(REPLACE(name, '_', ''), 6) + '01') = 1 
) 
SELECT @sql += 'DROP TABLE ' + o + ';' FROM p 
    WHERE d < CONVERT(CHAR(8), DATEADD(MONTH, -12, CURRENT_TIMESTAMP), 112); 

PRINT @sql; 
--EXEC sp_executesql @sql; 
+0

+1 कुशल और लूप मुक्त –

+0

बहुत अच्छा, धन्यवाद :) –

2

इस क्वेरी के लिए केवल उन होने अस्थायी तालिका से स्थापित हो जाएगा जहां तालिका नाम के अंत में एक तारीख है:

SELECT SCHEMA_NAME(T.schema_id) + '.' + T.name TableName, 
    REPLACE((RIGHT(T.name, 7) + '_01'), '_', '-') TableDate 
INTO #M 
FROM sys.tables T 
WHERE ISDATE(REPLACE((RIGHT(T.name, 7) + '_01'), '_', '-')) = 1; 

अगले भाग किसी भी तालिका है कि अभी भी कर रहे हैं "वर्तमान" हटा रहा है - तारीख कि अर्थ विस्तार के पास आपके 12 महीने की विंडो के अंदर है:

DELETE FROM #M 
WHERE DATEADD(MONTH, -12, TableDate) < GETDATE(); 

अब आप #M में केवल मिलान तालिकाओं के साथ छोड़ दिया जाता है, अतः तुम सिर्फ माध्यम से लूप जो भी फैशन में आप चाहें तो कर सकते हैं, टेबल ड्रॉप करने गतिशील एसक्यूएल क्रियान्वित (ओं):

WHILE (EXISTS (SELECT * FROM #M)) BEGIN 
    DECLARE @TableName VarChar(100) = (SELECT TOP 1 TableName FROM #M); 
    DECLARE @SQL NVarChar(1000) = 'DROP TABLE ' + @TableName; 
    EXEC (@SQL); 
    DELETE FROM #M WHERE TableName = @TableName; 
END; 

सफाई के लिए, अस्थायी तालिका ड्रॉप के साथ-साथ: तिथि पिछले 7

DROP TABLE #M; 
0

हैं तो यह आप सूची दिनांकों देने के लिए काम करना चाहिए। मैं वास्तव में अंतिम परीक्षण नहीं कर सका क्योंकि मेरी कोई भी तालिका उस प्रारूप के अनुरूप नहीं है। इसकी समस्या यह है कि यदि किसी भी तालिका के नाम उस प्रारूप के अनुरूप नहीं हैं तो चयन विफल रहता है। आपको डिलीट/ड्रॉप सिंटैक्स जोड़ना होगा, लेकिन उम्मीद है कि यह आपको एक सूची प्राप्त करेगा।

select name from sysobjects where xtype='u' 

    select DATEDIFF(dd, CONVERT(datetime,REPLACE(SUBSTRING('TABLE_C_2010_08',LEN('TABLE_C_2010_08')-6, 7),'_','.') + '.01',101), GETDATE()) 


    select name 
    from sysobjects 
    where xtype='u' 
    and DATEDIFF(dd, CONVERT(datetime,REPLACE(SUBSTRING(name,LEN(name)-6, 7),'_','.') + '.01',101), GETDATE()) > 0 
+0

नीरस से जवाब बेहतर है। जब मैंने इस पर शुरुआत की तो उसे पोस्ट नहीं किया गया था। – Paparazzi

संबंधित मुद्दे