如何在SQL Server中删除具有特定名称的表?

时间:2017-11-24 03:02:22

标签: sql sql-server

Guru请帮助我。

我有一个名为img的主表,我们每个月都会创建新的表格和后缀,其中包含月份和年份Character<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0/react-dom.min.js"></script> <html> <head> <title>Test</title> </head> <body> <div id="app"></div> <script type="text/jsx"> var App = React.createClass({ handleClick: function(e) { if (e.type === 'click') { console.log('Left click'); } else if (e.type === 'contextmenu') { console.log('Right click'); } }, render : function(){ return <p onClick={this.handleClick} onContextMenu={this.handleClick} >Something </p> } }); React.render(<App />, document.getElementById('app')); </script> </body> </html>

我必须保留这些表7年,并删除任何超过7年的表。

因此,该作业将于2017年2月删除ABCABC_012010将于2017年3月删除,依此类推

作业每月运行一次,以检查和删除符合条件的任何表格。

4 个答案:

答案 0 :(得分:0)

尝试:您需要dynamic query, loop and temporary tables才能执行此操作,并且您的表格格式必须与示例中提到的格式相同。您可以在多个表格中以这种方式执行INSERT, UPDATE, DELETE, DROP, TRUNCATE

    --Selecting table name in date format with `LEFT` `RIGHT` function
SELECT name, 
    CAST(CONCAT(LEFT(RIGHT(name, 6), 2), '-01-', RIGHT(RIGHT(name, 6), 4)) AS DATE) AS tableDate, 
    CAST(GETDATE() AS DATE) AS currentDate
INTO #tmp_date 
FROM sys.objects 
WHERE TYPE = 'u' AND NAME LIKE 'ABC[_]%'

--Storing table names that are older than 7 years from current date
SELECT id = IDENTITY(INT, 1, 1), 
    NAME 
INTO #object_name FROM #tmp_date 
WHERE (DATEDIFF(MM,tableDate, currentDate)-1) > = 84 

DECLARE @i INT = 1, @j INT, @sql VARCHAR(500), @object_name VARCHAR(100)

SELECT @j = MAX(id) FROM #object_name

WHILE @i < = @j 
BEGIN
    SELECT @object_name = NAME FROM #object_name WHERE id = @i
    SET @sql = 'DELETE FROM ' + @object_name --can use `DROP` to drop the table
    EXEC (@sql)

    SET @i = @i+1

END

答案 1 :(得分:0)

尝试以下方法:

System Traces/NaiveIntegrator.trace

DBNAME 替换为您的数据库名称。

HTH!

感谢。

答案 2 :(得分:0)

您可以使用dynamic query, while and if conditionals构建存储过程或预定作业(如您所愿)来解决此问题。试试这个。

CREATE PROCEDURE dbo.delete_abc @Date date, @years_diff int
AS 
    --- Declare variables to use
    DECLARE @sqlCommand varchar(30)
    DECLARE @table varchar(20)
    DECLARE @month int
    DECLARE @year int

    --- Temporary table with 'ABC_'s table names
    SELECT TABLE_NAME
    INTO #Temp
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME LIKE 'ABC_%'
    AND TABLE_TYPE='BASE TABLE' -- If you want only tables

    ---- While there are tables to compare
    WHILE EXISTS(SELECT * FROM #Temp)
    BEGIN
        --- Extract Month and Year of the first row in 'ABC_'s table
        SET @month = (SELECT TOP 1 SUBSTRING(TABLE_NAME,5,2) FROM #Temp)
        SET @year = (SELECT TOP 1 SUBSTRING(TABLE_NAME,7,4) FROM #Temp)

        --- Compare if date difference of the table is more than @years_diff years from @Date
        IF DATEDIFF(YEAR, CAST(CAST(@year AS VARCHAR) + '-' + CAST(@month AS VARCHAR) + '-01' AS DATE), DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0)) > @years_diff 
            BEGIN
            --- Construct and execute delete query
            SET @table = (SELECT TOP 1 TABLE_NAME FROM #Temp)
            SET @sqlCommand = 'DROP TABLE ' + @table  --- or 'DELETE FROM ' if you only want to delete all rows from table
            EXEC(@sqlCommand)
            END

     --- Delete first row of 'ABC_'s tables in temporary
     DELETE TOP (1) FROM #Temp;

     END

     --- Drop temporary table
     DROP TABLE #Temp
GO;

创建后,您可以使用此存储过程或您喜欢的参数:

DECLARE @Now date
SET @Now = GETDATE()
EXEC dbo.delete_abc @years_diff = 7, @Date = @Now

答案 3 :(得分:-1)

制作删除查询不是很容易吗?

Delete From [Your_Table] Where [Date_Column] = 'ABC_012010'