April 9, 2009 at 9:53 am
I want an opinion on whether this code is safe for what I want to do and what possible problems I should look out for.
I have a production database that contains tables of product orders generated daily from my order entry system. We use the files for variable data printing. Currently, I manually delete the tables usually once a month. I try and keep the tables for 60 days for research and re-print purposes. I want to setup a SQL Agent job that will delete/drop the tables based on the create date. I have tested this code on a development database and it seems to works.
Exec sp_MSforeachtable
@command1 = "DROP TABLE ? PRINT '? dropped'",
@whereand = "select * from sys.objects where type = 'U'
AND IS_MS_SHIPPED = '0'
AND DATEDIFF(DAY, CREATE_DATE, GETDATE()) > 60"
Your thoughts or ideas are appreciated.
For help on getting help, follow the link below:
http://www.sqlservercentral.com/articles/Best+Practices/61537/
April 9, 2009 at 10:24 am
if any foreign keys exist between your tables,your sp_msforEachTable might fail...they have to be dropped in FK hierarchy order.
there's a lot of ways to get your tables in FK order, here's a script incase you need it:
SET NOCOUNT OFF
DECLARE
@Level INT,
@MovedToNewLevel INT,
@sql varchar(1024),
@err varchar(125),
@LastBatch int
CREATE TABLE #Hierarchy
(FKLevel INT,
TblName VARCHAR(100),
id Numeric
)
-- Populate the table
INSERT INTO #Hierarchy
select 0 AS 'FKLevel', name as 'TblName',id
FROM sysobjects where xtype='U' and
id not in (select rkeyid from sysforeignkeys) and
id not in (select fkeyid from sysforeignkeys)
INSERT INTO #Hierarchy select 1 AS 'FKLevel', name as 'TblName',id
FROM sysobjects where xtype='U' and
id not in (select id from #Hierarchy) and
id in (select rkeyid from sysforeignkeys) and
id not in (select fkeyid from sysforeignkeys)
INSERT INTO #Hierarchy select 2 AS 'FKLevel', name as 'TblName',id
FROM sysobjects where xtype='U' and
id not in (select id from #Hierarchy) and
id in (select fkeyid from sysforeignkeys)
-- Set the variables
set @Level=2
set @MovedtoNewLevel=1
WHILE @MovedtoNewLevel <> 0
BEGIN
set @LastBatch=@MovedtoNewLevel
set @sql='update #Hierarchy set FKLevel = FKLevel + 1 where FKLevel=' + CAST(@Level as varchar) + ' and'
set @sql=@sql + ' id in (select fkeyid from sysforeignkeys where fkeyid<>rkeyid and'
set @sql=@sql + ' rkeyid in (select id from #Hierarchy where FKLevel=' + CAST(@Level as varchar) + ' ))'
exec(@sql)
SET @MovedtoNewLevel = @@Rowcount
set @err='#ID''s yet to be processed :' + convert(varchar,@MovedtoNewLevel)
--'BANDAID TO WORK AROUND CIRCULAR FK REFERENCES, WHERE EVENTUALLY,
--TABLEA REFERS TO TABLEQ AND TABLEQ REFERS TO TABLEA
if @LastBatch=@MovedtoNewLevel
BEGIN
select top 1 @err= TblName from #Hierarchy WHERE FKLevel IN(SELECT MAX(FKLevel) FROM #Hierarchy )
set @err = 'possible Circular FK''s found, arbitrarily changing ' + @err + ' to break circular reference.'
RAISERROR (@err,1,1)
set rowcount 1
UPDATE #Hierarchy SET FKLevel = FKLevel - 1
WHERE FKLevel IN(SELECT MAX(FKLevel) FROM #Hierarchy )
set rowcount 0
END
--RAISERROR(@ERR,1,1)
SELECT @Level = @Level + 1
End
SELECT *
FROM #Hierarchy
order by FKLEVEL DESC
Lowell
April 9, 2009 at 10:34 am
Sorry Lowell I always forget something... :Whistling:
The tables are basically flatfiles. There is no FK or PK for that matter. They are a collection of denormalized data.
For help on getting help, follow the link below:
http://www.sqlservercentral.com/articles/Best+Practices/61537/
April 9, 2009 at 10:57 am
there you go then, no worries.
about the only thing i could suggest is a lot of people here recommend creating a list of commands in a varchar(max) string and then executing that, instead of using any loop or cursor to do the work;(sp_MSforEachTable uses a cursor behind the schenes.)
you can build a string or use the FOR XML shortcut to concatenate strings like that.
declare @command varchar(max)
SET @command=''
select @command = @command + 'DROP TABLE ' + name + '; ' + CHAR(13) + CHAR(10) + 'PRINT ''TABLE ' + name + ' Dropped.''' + CHAR(13) + CHAR(10)
FROM sys.objects A
where type = 'U'
AND IS_MS_SHIPPED = '0'
AND DATEDIFF(DAY, CREATE_DATE, GETDATE()) > 60
select @command
--execute(@command)
Lowell
April 9, 2009 at 11:42 am
Thank you for your help! I will try your script.
For help on getting help, follow the link below:
http://www.sqlservercentral.com/articles/Best+Practices/61537/
Viewing 5 posts - 1 through 5 (of 5 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy